﻿using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using GeneralLibs;
using Lists;
using System.Linq;
using System.Data.Objects;
using CustomControls;
using Vouchers;
using BasicForms;
using System.Threading;
using System.Data.SqlClient;
using Excel = Microsoft.Office.Interop.Excel;
using KhuyenMai;
using ListForms;
using System.Collections.Generic;
using BanHang;
using DevExpress.XtraEditors;
using DevExpress.XtraGrid.Columns;

namespace BanLe
{
    public partial class FrmEditHoaDonBanLe : FrmBase
    {
        private bool _AllowSave = true; //Cờ cho phép chạy menthod Save() hay không.
        private bool _AllowShowMessageXuatHangAm = true; //Cờ cho phép hiện thông báo hay k. Vì khi check xuất âm ở row["VatTuHangHoa1ID"], và row["Value1"] khác nhau. Có sẽ có lúc bị hiện 2 lần.
        private DataRow _DetectedHangTonAm = null;  //Cờ dành cho kiểm tra hàng xuất âm tại row["VatTuHangHoa1ID"]
        private ChuongTrinhKhuyenMai _ActiveChuongTrinhKhuyenMai = null;    //Lưu chương trình khuyến mại đang hoạt động
        private SqlConnection con;
        private SqlCommand cmd;
        private bool _PrintVoucher = false;
        private DateTime _DateExpiredVoucher = Convert.ToDateTime("25/06/2044 23:00:00");  // Chưa chốt thời điểm hết hạn
        Store _Store = DanhMucStore.Instance.GetByStoreID(Config.StoreID);
        private DateTime _TimeReloadLatest = new DateTime();
        private bool _PreventFillTongCong = false;
        private string _TenStoreUpper = DanhMucStore.Instance.StoreNameUpper();

        #region Change event and delegate
        public delegate void OnVoucherChanged(ChungTu chungTu);
        /// <summary>
        /// Occur whenever this voucher is modified: added new, deleted, updated
        /// </summary>
        /// <param name="?"></param>
        /// <returns></returns>
        public event OnVoucherChanged VoucherChanged;
        #endregion

        #region RequestAddNew event and delegate
        public delegate void OnRequestAddNew();
        /// <summary>
        /// Occur whenever this voucher is modified: added new, deleted, updated
        /// </summary>
        /// <param name="?"></param>
        /// <returns></returns>
        public event OnRequestAddNew RequestAddNew;
        #endregion

        #region DanhSachChungTu property
        private DanhSachChungTu _DanhSachChungTu;
        public DanhSachChungTu DanhSachChungTu
        {
            get
            {
                return _DanhSachChungTu;
            }
            set
            {
                _DanhSachChungTu = value;
            }
        }
        #endregion

        #region ChungTu property
        private ChungTu _ChungTu;
        public ChungTu ChungTu
        {
            get
            {
                return _ChungTu;
            }
            set
            {
                _ChungTu = value;
            }
        }
        #endregion

        #region EditState property
        private EditState _EditState;
        public EditState EditState
        {
            get
            {
                return _EditState;
            }
            set
            {
                _EditState = value;
            }
        }
        #endregion

        private DataTable _GridDataSouce
        {
            get
            {
                if (customGridKhoanMuc.DataSource is DataTable)
                    return customGridKhoanMuc.DataSource as DataTable;
                else return null;
            }
        }
        private DataTable _TableTheThanhVien = new DataTable();

        public FrmEditHoaDonBanLe()
        {
            try
            {
                InitializeComponent();

                DieuKienTimKiemChungTu dieuKienTimKiemChungTu = new DieuKienTimKiemChungTu();
                dieuKienTimKiemChungTu.LoaiChungTu = DanhMucLoaiChungTu.Instance.GetByMa("HoaDonBanLe");
                DateTime fivedayago = DateTime.Now.AddMinutes(-5);
                dieuKienTimKiemChungTu.TuNgay = new NullableDate(new DateTime(fivedayago.Year, fivedayago.Month, fivedayago.Day, 0, 0, 1));
                dieuKienTimKiemChungTu.DenNgay = new NullableDate(new DateTime(CommonLib.GetSystemDateTime().Date.Year, 12, 31, 23, 59, 59));
                _DanhSachChungTu = new DanhSachChungTu();
                _DanhSachChungTu.LoadFromDB(dieuKienTimKiemChungTu.BuildSqlStatement(1000000, 1));

                con = new SqlConnection(GeneralLibs.LocalSettings.ConnectString);
                cmd = con.CreateCommand();
            }
            catch (Exception ex)
            {
                BasicForms.FrmExceptionNotifier.ShowAndLog(ex);
            }
        }

        public FrmEditHoaDonBanLe(ChungTu chungTu)
        {
            try
            {
                InitializeComponent();
                _ChungTu = chungTu;

                DieuKienTimKiemChungTu dieuKienTimKiemChungTu = new DieuKienTimKiemChungTu();
                dieuKienTimKiemChungTu.LoaiChungTu = DanhMucLoaiChungTu.Instance.GetByMa("HoaDonBanLe");
                DateTime fivedayago = DateTime.Now.AddMinutes(-5);
                dieuKienTimKiemChungTu.TuNgay = new NullableDate(new DateTime(fivedayago.Year, fivedayago.Month, fivedayago.Day, 0, 0, 1));
                dieuKienTimKiemChungTu.DenNgay = new NullableDate(new DateTime(CommonLib.GetSystemDateTime().Date.Year, 12, 31, 23, 59, 59));
                _DanhSachChungTu = new DanhSachChungTu();
                _DanhSachChungTu.LoadFromDB(dieuKienTimKiemChungTu.BuildSqlStatement(1000000, 1));

                con = new SqlConnection(GeneralLibs.LocalSettings.ConnectString);
                cmd = con.CreateCommand();
            }
            catch (Exception ex)
            {
                BasicForms.FrmExceptionNotifier.ShowAndLog(ex);
            }
        }

        private void FrmEditHoaDonBanLe_Load(object sender, EventArgs e)
        {
            if (DesignMode) return;
            timerKhuyenMai.Interval = 1000; // Để một giây để check khuyến mại luôn.

            SqlConnection con = new SqlConnection(LocalSettings.ConnectString);
            try
            {
                //Các chi nhánh khác dùng bình thường
                txtMaHang.Visible = false;
                cmbMaHang.Visible = true;
                cmbMaHang.BringToFront();

                if (DanhMucStore.Instance.CurrentStore().Ten.ToUpper().Contains("THENAME"))
                {
                    int size = 12;
                    customGridKhoanMuc.gridViewKhoanMuc.Appearance.HeaderPanel.Font = new Font("Arial", size);
                    customGridKhoanMuc.gridViewKhoanMuc.Appearance.Row.Font = new Font("Arial", size);

                    customGridKhoanMuc.gridViewRef.Appearance.HeaderPanel.Font = new Font("Arial", size);
                    customGridKhoanMuc.gridViewRef.Appearance.Row.Font = new Font("Arial", size);

                    cmbMaHang.gridView.Appearance.HeaderPanel.Font = new Font("Arial", size);
                    cmbMaHang.gridView.Appearance.Row.Font = new Font("Arial", size);

                    txtMaHang.Font = new Font("Arial", size);

                    //K dùng combo để chọn hàng mà dùng textbox
                    cmbMaHang.Visible = false;
                    txtMaHang.Visible = true;
                    txtMaHang.BringToFront();
                    txtMaHang.Focus();
                }

                //Muốn to cmb ra, control này có 2 lớp, lớp áo ngoài và lớp popupList trong ruột
                //Cần set cả 2 để cho to ra, nhưng popupList thì k chỉnh size trực tiếp được mà cho font to ra
                cmbMaHang.Size = new Size(cmbMaHang.Width, 30);
                cmbMaHang.popupList.Font = new Font("Arial", 12, FontStyle.Bold);

                #region Format ẩn hiện các thông tin theo từng khách hàng

                //Update lại giá vốn nếu bị lệch. Chỉ dành cho hóa đơn mua hàng
                try
                {
                    con.Open();
                    SqlCommand cmd = con.CreateCommand();
                    cmd.CommandText = "ALTER TABLE ChungTu ADD MaTheThanhVien nvarchar(50) DEFAULT ''";
                    cmd.ExecuteNonQuery();
                }
                catch (Exception ex)
                { }

                //Reset lại thông tin hiển thị thẻ thành viên, để phía duwois k có dữ liệu thì k hiện lung tung
                lblMaThe.Text = "";
                lblHoTen.Text = "";
                lblDienThoai.Text = "";
                lblCMND.Text = "";

                //Hiện group thẻ thành viên qua Web cho những nơi lớn, làm dịch vụ nhiều chi nhánh
                if (_TenStoreUpper.Contains("HUYHOANG") || _TenStoreUpper.Contains("VINH") ||
                    _TenStoreUpper.Contains("BACHKHOA") || _TenStoreUpper.Contains("CPIN") ||
                    _TenStoreUpper.Contains("PHOSACHHN"))
                {
                    cmbTimKiemHangHoa.Visible = true;
                    labelTimKiem.Visible = true;
                    lblThongTinTonKhoTimKiem.Visible = true;

                    //Group thẻ thành viên
                    groupControlTheThanhVien.Visible = true;
                }
                else
                {
                    cmbTimKiemHangHoa.Visible = false;
                    labelTimKiem.Visible = false;
                    lblThongTinTonKhoTimKiem.Visible = false;

                    //Group thẻ thành viên
                    groupControlTheThanhVien.Visible = false;
                }

                //Hiện thông tin khách hàng thân thiết trực tiếp, cho khách hàng nhỏ có yêu cầu
                if (_TenStoreUpper.Contains("MINH"))
                    btnThemKhachHang.Visible = true;
                else
                    btnThemKhachHang.Visible = false;

                if (_TenStoreUpper.Contains("VIETBOOK"))
                {
                    btnThongKe.Visible = true;
                    btnThongKe.Enabled = true;
                }
                else
                {
                    btnThongKe.Visible = false;
                    btnThongKe.Enabled = false;
                }

                ////PHS phú thọ đổi tiền khách đưa sang F5
                //if (_TenStoreUpper.Contains("PHSPHUTHO"))
                //{
                label8.Text = "Tiền CK (F5)";
                label8.AutoSize = false;
                label8.TextAlign = ContentAlignment.MiddleRight;

                label13.Text = "Khách đưa (F6)";
                label13.AutoSize = false;
                label13.TextAlign = ContentAlignment.MiddleRight;
                //}
                //else
                //{
                //    label8.Text = "Tiền CK";
                //    label13.Text = "Khách đưa (Alt+H)";
                //}

                #endregion

                BasicForms.FrmProgressBar.StartShowProgress();

                lblTenCuaHang.Text = string.Format("{0}, {1}", Config.TenDoanhNghiep, Config.DiaChi);

                #region cmbDoiTuong
                cmbDoiTuong.DataSource = DanhMucDoiTuongNghiepVu.GetDanhMucKhachHang().DataView;
                cmbDoiTuong.DisplayColumn = "Ten";
                cmbDoiTuong.ValueColumn = "ID";
                cmbDoiTuong.AddVisibleColumn("Ma", "Mã");
                cmbDoiTuong.AddVisibleColumn("Ten", "Tên");
                cmbDoiTuong.AddVisibleColumn("DienThoaiCoDinh", "Điện thoại");
                #endregion

                #region cmbKho
                cmbKho.DataSource = DanhMucKho.Instance.DataView;
                cmbKho.DisplayColumn = "Ten";
                cmbKho.ValueColumn = "ID";
                cmbKho.AddVisibleColumn("Ma", "Mã");
                cmbKho.AddVisibleColumn("Ten", "Tên");
                #endregion

                #region cmbMaHang
                if (DanhMucStore.Instance.CurrentStore().Ten.ToUpper().Contains("THENAME"))
                {
                    cmbMaHang.DataSource = DanhMucVatTuHangHoa.GetDanhMucHangHoaDangSuDung().DataView;
                    cmbMaHang.PopupWidth = 650;
                    cmbMaHang.PopupHeight = 297;
                    cmbMaHang.DisplayColumn = "Ma";
                    cmbMaHang.ValueColumn = "ID";
                    cmbMaHang.AddVisibleColumn("Ma", "Mã", 200, 1);
                    cmbMaHang.AddVisibleColumn("Ten", "Tên", 410, 2);
                    cmbMaHang.AddVisibleColumn("GiaBia", "Giá bán", 40, 3);
                }
                else
                {
                    cmbMaHang.DataSource = DanhMucVatTuHangHoa.GetDanhMucHangHoaDangSuDung().DataView;
                    cmbMaHang.PopupWidth = 500;
                    cmbMaHang.PopupHeight = 297;
                    cmbMaHang.DisplayColumn = "Ma";
                    cmbMaHang.ValueColumn = "ID";
                    cmbMaHang.AddVisibleColumn("Ma", "Mã", 120, 1);
                    cmbMaHang.AddVisibleColumn("Ten", "Tên", 320, 2);
                    cmbMaHang.AddVisibleColumn("GiaBia", "Giá bán", 70, 3);
                }

                //Có cho phép hiển thị gridRef khi search số ở cmbMaHang hay k
                if (Config.SuDungSearchWithNumberChoCombo == SuDungSearchWithNumberChoCombo.DuocPhep)
                    cmbMaHang.SearchWithNumber = true;
                else
                    cmbMaHang.SearchWithNumber = false;
                #endregion

                #region cmbTimKiemHangHoa
                cmbTimKiemHangHoa.DataSource = DanhMucVatTuHangHoa.GetDanhMucHangHoaDangSuDung().DataView;
                cmbTimKiemHangHoa.PopupWidth = 500;
                cmbTimKiemHangHoa.PopupHeight = 297;
                cmbTimKiemHangHoa.DisplayColumn = "Ten";
                cmbTimKiemHangHoa.ValueColumn = "ID";
                cmbTimKiemHangHoa.AddVisibleColumn("Ma", "Mã", 120, 1);
                cmbTimKiemHangHoa.AddVisibleColumn("Ten", "Tên", 320, 2);
                cmbTimKiemHangHoa.AddVisibleColumn("GiaBia", "Giá bán", 70, 3);

                //Có cho phép hiển thị gridRef khi search số ở cmbMaHang hay k
                if (Config.SuDungSearchWithNumberChoCombo == SuDungSearchWithNumberChoCombo.DuocPhep)
                    cmbMaHang.SearchWithNumber = true;
                else
                    cmbMaHang.SearchWithNumber = false;
                #endregion

                #region cmbThueSuat
                cmbThueSuat.DataSource = DanhMucThueSuat.Instance.DataView;
                cmbThueSuat.DisplayColumn = "Ten";
                cmbThueSuat.ValueColumn = "ID";
                cmbThueSuat.AddVisibleColumn("Ma", "Mã");
                cmbThueSuat.AddVisibleColumn("Ten", "Tên");
                #endregion

                #region DataForGrid
                CustomControls.DataForGrid dataForGrid = null;

                dataForGrid = new CustomControls.DataForGrid();
                if (DanhMucStore.Instance.CurrentStore().Ten.ToUpper().Contains("THENAME"))
                {
                    customGridKhoanMuc.PopupHeight = 297;
                    customGridKhoanMuc.PopupWidth = 650;

                    dataForGrid = new CustomControls.DataForGrid();
                    dataForGrid.DataSource = DanhMucVatTuHangHoa.GetDanhMucHangHoaDangSuDung().DataView;
                    dataForGrid.AddVisibleColumn("Ma", "Mã", 200, 1);
                    dataForGrid.AddVisibleColumn("Ten", "Tên", 410, 2);
                    dataForGrid.AddVisibleColumn("GiaBia", "Giá bán", 40, 3);
                    dataForGrid.DisplayColumn = "Ma";
                    dataForGrid.ValueColumn = "ID";
                    customGridKhoanMuc.HtDataForGrid.Add("VatTuHangHoa1ID", dataForGrid);
                }
                else
                {
                    customGridKhoanMuc.PopupHeight = 297;
                    customGridKhoanMuc.PopupWidth = 500;

                    dataForGrid = new CustomControls.DataForGrid();
                    dataForGrid.DataSource = DanhMucVatTuHangHoa.GetDanhMucHangHoaDangSuDung().DataView;
                    dataForGrid.AddVisibleColumn("Ma", "Mã", 100, 1);
                    dataForGrid.AddVisibleColumn("Ten", "Tên", 320, 2);
                    dataForGrid.AddVisibleColumn("GiaBia", "Giá bán", 80, 3);
                    dataForGrid.DisplayColumn = "Ma";
                    dataForGrid.ValueColumn = "ID";
                    customGridKhoanMuc.HtDataForGrid.Add("VatTuHangHoa1ID", dataForGrid);
                }
                #endregion

                //TTSHN tính thuế tự động kiểu riêng
                if (DanhMucStore.Instance.CurrentStore().Ten.ToUpper().Contains("TTSHN")
                    || DanhMucStore.Instance.CurrentStore().Ten.ToUpper().Contains("MINH"))
                    cmbThueSuat.Enabled = false;
                else
                    cmbThueSuat.Enabled = true;

                if (_ChungTu == null || _ChungTu.ChungTuID == Guid.Empty)
                {
                    lblNguoiBan.Text = CustomSecurity.User.CurUser.FullName;

                    MayTinh mt = DanhMucMayTinh.Instance.GetByHardwareID(GeneralLibs.LocalSettings.HeThong.HardwareID);
                    if (mt != null)
                        lblTenMay.Text = mt.Ten;

                    #region Format giao dien cac cot
                    _ChungTu = _DanhSachChungTu.CreateNew(DanhMucLoaiChungTu.Instance.GetByMa("HoaDonBanLe"));
                    _ChungTu.LoadDanhSachChungTuPhuThuoc();
                    ChungTu phieuXuatKho = _ChungTu.DanhSachChungTuPhuThuoc.CreateNew(DanhMucLoaiChungTu.Instance.GetByMa("PhieuXuatKho"));
                    phieuXuatKho.LoadKhoanMuc();
                    customGridKhoanMuc.DataSource = phieuXuatKho.DanhSachKhoanMuc.DataTable;
                    customGridKhoanMuc.FormatColumns(GeneralLibs.Config.GiaoDienChungTu.Filter(_ChungTu.LoaiChungTuID));
                    #endregion

                    #region Default values
                    DoiTuongNghiepVu khachLe = DanhMucDoiTuongNghiepVu.GetDanhMucKhachHang().GetByTen("Khách lẻ");
                    if (khachLe != null)
                    {
                        cmbDoiTuong.EditValue = khachLe.ID;
                    }

                    cmbMaHang.EditValue = null;
                    if (_TenStoreUpper.Contains("PHSPHUTHO"))
                    {
                        //Nếu là PHS Phú thọ thì fix kho bán lẻ cho họ luôn, và k cho nhân viên thay đổi
                        Kho kho = DanhMucKho.Instance.GetByProperty("Ma", "TC");
                        cmbKho.EditValue = kho.ID;
                        cmbKho.Enabled = false;
                    }
                    else if ((Guid)GeneralLibs.LocalSettings.HeThong.KhoID != Guid.Empty)
                        cmbKho.EditValue = GeneralLibs.LocalSettings.HeThong.KhoID;

                    cmbThueSuat.EditValue = DanhMucThueSuat.Instance.GetByProperty("Ma", "V00").ID;

                    _ChungTu.TrueFalse1 = false; //Thanh toán qua thẻ
                    #endregion

                    Reset();
                }
                else
                {
                    if (_ChungTu.UserID is Guid && _ChungTu.UserID != Guid.Empty && CustomSecurity.UserList.Instance.GetByID(_ChungTu.UserID) != null)
                        lblNguoiBan.Text = CustomSecurity.UserList.Instance.GetByID(_ChungTu.UserID).FullName;

                    string orderNumber = "";
                    if (CommonLib.StartWithSoMay(_ChungTu.So))
                    {
                        orderNumber = _ChungTu.So.Substring(0, 2);
                    }
                    else
                    {
                        MayTinh mayTinh = DanhMucMayTinh.Instance.GetByHardwareID(LocalSettings.HeThong.HardwareID);
                        orderNumber = mayTinh.GetSoMay();
                    }
                    MayTinh mt = DanhMucMayTinh.Instance.GetByOrderNumber(orderNumber);
                    if (mt != null)
                        lblTenMay.Text = mt.Ten;

                    cmbDoiTuong.EditValue = _ChungTu.DoiTuongNghiepVu1ID;
                    cmbKho.EditValue = _ChungTu.Kho1ID;
                    cmbThueSuat.EditValue = _ChungTu.ThueSuat1ID;
                    txtSo.EditValue = _ChungTu.So;
                    dateNgay.EditValue = _ChungTu.Ngay.Date;
                    cmbMaHang.EditValue = null;

                    if (_ChungTu.GhiSo)
                        SetEditState(EditState.SavedInLedger);
                    else
                        SetEditState(EditState.SavedButNotInLedger);
                    _ChungTu.LoadDanhSachChungTuPhuThuoc();
                    ChungTu phieuXuatKho = _ChungTu.DanhSachChungTuPhuThuoc.GetFirstRow();
                    phieuXuatKho.LoadKhoanMuc();
                    customGridKhoanMuc.DataSource = phieuXuatKho.DanhSachKhoanMuc.DataTable;
                    customGridKhoanMuc.FormatColumns(GeneralLibs.Config.GiaoDienChungTu.Filter(_ChungTu.LoaiChungTuID));

                    //Phải đặt dưới cùng để không bị ảnh hưởng bởi FillTongCong

                    decimal tongTheoGiaBia = 0;

                    try
                    {
                        tongTheoGiaBia = _GridDataSouce.AsEnumerable().Sum(r => r.Field<decimal>("Value1") * r.Field<decimal>("Value12"));
                    }
                    catch (Exception ex)
                    {
                        tongTheoGiaBia = Convert.ToDecimal(_GridDataSouce.Compute("SUM(Value13)", "Value13 IS NOT NULL"));
                    }

                    txtTongGiaBia.EditValue = tongTheoGiaBia;
                    txtTongSoTien.EditValue = _ChungTu.SoTienNT;
                    txtTongSoLuong.EditValue = _ChungTu.Value11;
                    txtTongChietKhau.EditValue = _ChungTu.Value8;

                    txtSoTienKhachDua.EditValue = _ChungTu.Value2;
                    txtSoTienTraLai.EditValue = _ChungTu.Value3;
                    chkThanhToanQuaThe.Checked = _ChungTu.TrueFalse1; //Thanh toán qua thẻ
                }

                if (CustomSecurity.User.CurUser.UserName == "SupAdmin" || CustomSecurity.User.CurUser.RoleList.Contains("Admin"))
                    btnExportToExcel.Visible = true;

                #region Set datasource cho Thẻ thành viên

                SqlConnection conTheThanhVien = new SqlConnection(LocalSettings.ConnectStringForTheThanhVien(_TenStoreUpper));
                try
                {
                    conTheThanhVien.Open();

                    SqlDataAdapter da = new SqlDataAdapter();
                    DataTable dt = new DataTable();

                    cmd = conTheThanhVien.CreateCommand();
                    cmd.Parameters.Clear();
                    cmd.CommandText = string.Format("SELECT A.*, B.Ma MaTrangThai, B.Ten TenTrangTHai FROM A0_DMThanhVien A INNER JOIN A0_DMTrangThaiSuDung B ON A.TrangThaiSuDungID = B.id\n");

                    cmd.CommandType = CommandType.Text;
                    da.SelectCommand = cmd;
                    da.Fill(_TableTheThanhVien);

                    if (_TableTheThanhVien != null)
                    {
                        cmbTheThanhVien.PopupWidth = 500;
                        cmbTheThanhVien.PopupHeight = 297;

                        cmbTheThanhVien.DataSource = _TableTheThanhVien.DefaultView;
                        cmbTheThanhVien.DisplayColumn = "HoTen";
                        cmbTheThanhVien.ValueColumn = "id";
                        cmbTheThanhVien.AddVisibleColumn("MaThe", "Mã", 100, 1);
                        cmbTheThanhVien.AddVisibleColumn("HoTen", "Tên", 300, 1);
                        cmbTheThanhVien.AddVisibleColumn("TenTrangTHai", "Trạng thái", 100);
                    }
                }
                catch (Exception ex)
                { }
                finally
                {
                    conTheThanhVien.Close();
                }

                #endregion

                //Ẩn hiện nút nhận hàng trả lại
                if (_TenStoreUpper.Contains("PHSPHUTHO"))
                {
                    //Phú thọ luôn hiện
                    btnNhanTraLai.Visible = true;
                }
                else
                {
                    //Các chi nhánh khác kiểm tra quyền
                    btnNhanTraLai.Visible = (CustomSecurity.User.CurUser.CheckPrivilege("FrmEditHangBanTraLai", CustomSecurity.Right.ReadWrite));
                }


                SetNumberDisplayFormat();
                BasicForms.FrmProgressBar.FinishShowProgress();
                timer.Start();
            }
            catch (Exception ex)
            {
                BasicForms.FrmExceptionNotifier.ShowAndLog(ex);
            }
            finally
            {
                con.Close();
            }
        }

        protected void SetEditState(EditState editState)
        {
            try
            {
                if (editState == EditState.CreatingNew) _PrintVoucher = true;
                _EditState = editState;
                base.SetEditState(EditState);
                switch (editState)
                {
                    case EditState.Modifying:
                    case EditState.CreatingNew:
                        btnSave.Enabled = true;
                        btnSaveAndPrint.Enabled = true;
                        btnSavePrintForeign.Enabled = true;
                        btnPrint.Enabled = false;
                        if ((CustomSecurity.User.CurUser.GetRight(this.Name.ToString()) & CustomSecurity.Right.Advancededit) > 0)
                        {
                            btnEdit.Visible = true;
                            btnEdit.Enabled = false;
                        }
                        else
                        {
                            btnEdit.Visible = false;
                        }
                        if (Config.DuocPhepSuaNgayHoaDon != DuocPhepSuaNgayHoaDonHayKhong.DuocPhep) dateNgay.Properties.ReadOnly = true;
                        //Nếu không phải admin Không cho sửa ngày bán lẻ
                        if (CustomSecurity.User.CurUser.UserName == "SupAdmin" || CustomSecurity.User.CurUser.RoleList.Contains("Admin"))
                            dateNgay.Properties.ReadOnly = false;
                        else
                            dateNgay.Properties.ReadOnly = true;
                        break;
                    case EditState.Saved:
                    case EditState.SavedInLedger:
                    case EditState.SavedButNotInLedger:
                        btnSave.Enabled = false;
                        btnSaveAndPrint.Enabled = false;
                        btnSavePrintForeign.Enabled = true;   //Lúc nào cũng cho hiện
                        btnPrint.Enabled = true;
                        if ((CustomSecurity.User.CurUser.GetRight(this.Name.ToString()) & CustomSecurity.Right.Advancededit) > 0)
                        {
                            btnEdit.Visible = true;
                            btnEdit.Enabled = true;
                        }
                        else
                        {
                            btnEdit.Visible = false;
                        }
                        break;
                }
            }
            catch (SqlException sqlEx)
            {
                throw new CustomException(CustomException.GetSqlExceptionMessage(sqlEx));
            }
            catch (Exception ex)
            {
                if (ex is CustomException) throw ex;
                else
                {
                    throw new Exception(ex.Message);
                }
            }
            finally
            {
            }
        }
        protected void SetNumberDisplayFormat()
        {
            try
            {
                FormatTextEdit(txtTongSoLuong, BasicForms.TextFormatType.Money);
                FormatTextEdit(txtSoTienKhachDua, BasicForms.TextFormatType.Money);
                FormatTextEdit(txtSoTienTraLai, BasicForms.TextFormatType.Money);
                FormatTextEdit(txtTongGiaBia, BasicForms.TextFormatType.Money);
                FormatTextEdit(txtTongSoTien, BasicForms.TextFormatType.Money);
                FormatTextEdit(txtTongChietKhau, BasicForms.TextFormatType.Money);
                FormatNumberInGridView(customGridKhoanMuc.gridViewKhoanMuc);

                txtTongSoLuong.Properties.ReadOnly = true;
                txtTongGiaBia.Properties.ReadOnly = true;
                txtTongSoTien.Properties.ReadOnly = true;
                txtSoTienTraLai.Properties.ReadOnly = true;
                if (DanhMucStore.Instance.CurrentStore().Ten.ToUpper().Contains("PHOSACHHN"))
                {
                    //Phố sách Huy Hoàng k cho sửa CK
                    txtTongChietKhau.Properties.ReadOnly = true;
                }
                else
                    txtTongChietKhau.Properties.ReadOnly = false;


                customGridKhoanMuc.gridViewKhoanMuc.OptionsBehavior.AllowAddRows = DevExpress.Utils.DefaultBoolean.False;
            }
            catch (SqlException sqlEx)
            {
                throw new CustomException(CustomException.GetSqlExceptionMessage(sqlEx));
            }
            catch (Exception ex)
            {
                if (ex is CustomException) throw ex;
                else
                {
                    throw new Exception(ex.Message);
                }
            }
        }

        protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
        {
            try
            {
                //Khi dùng phần mềm Internet lock thì bắt phím Alt+K biij lỗi --> bắt kiểu khác nữa
                int key = (int)keyData;
                //Cách bắt phím là show lên màn hình rồi ấn tổ hợp phím cần chọn --> sẽ hiện ra số cần bắt
                //MessageBox.Show(key.ToString());

                switch (key)
                {
                    //Tương đương với Alt bên trái + K
                    case 393291:
                        txtSoTienKhachDua.SelectAll();
                        txtSoTienKhachDua.Focus();
                        return true;
                        break;
                    //Tương đương với Alt bên trái + H
                    case 393288:
                        cmbMaHang.Focus();
                        return true;
                        break;
                }

                switch (keyData)
                {
                    case Keys.F1:
                        if (customGridKhoanMuc.DataSourceRef is DataView && cmbKho.EditValue != null)
                        {
                            BasicForms.FrmShowThongTinTonKho frm = new FrmShowThongTinTonKho((Guid)cmbKho.EditValue, dateNgay, (customGridKhoanMuc.DataSourceRef as DataView).ToTable());
                            frm.ShowDialog();
                            customGridKhoanMuc.DataSourceRef = null;
                        }
                        else if (cmbMaHang.DataSourceRef is DataView && cmbKho.EditValue != null)
                        {
                            BasicForms.FrmShowThongTinTonKho frm = new FrmShowThongTinTonKho((Guid)cmbKho.EditValue, dateNgay, (cmbMaHang.DataSourceRef as DataView).ToTable());
                            frm.ShowDialog();
                            cmbMaHang.DataSourceRef = null;
                        }
                        return true;
                        break;
                    case Keys.F2:
                        Reset();
                        cmbMaHang.Focus();
                        cmbMaHang.Select();
                        txtMaHang.Text = "";
                        if (txtMaHang.Visible)
                        {
                            txtMaHang.Focus();
                            txtMaHang.SelectAll();
                        }
                        return true;
                        break;
                    case Keys.F4:
                        Save();
                        return true;
                        break;
                    case Keys.F3:
                        KhuyenMaiTheoTongTienHoaDon();
                        return true;
                    case Keys.F8:
                        SaveAndPrint();
                        return true;
                        break;
                    case Keys.F7:
                        if (_EditState == EditState.CreatingNew || _EditState == EditState.Modifying)
                            chkThanhToanQuaThe.Checked = !chkThanhToanQuaThe.Checked;
                        return true;
                        break;
                    case Keys.F12:
                        if (_EditState == EditState.Saved || _EditState == EditState.SavedButNotInLedger || _EditState == EditState.SavedInLedger)
                        {
                            Print();
                        }
                        return true;
                        break;
                    case Keys.F10:
                        SaveAndPrintForeignLanguage();
                        return true;
                        break;
                    case Keys.F5:
                        txtTongChietKhau.SelectAll();
                        txtTongChietKhau.Focus();
                        return true;
                        break;
                    case Keys.F6:
                    case Keys.Alt | Keys.K:
                        txtSoTienKhachDua.SelectAll();
                        txtSoTienKhachDua.Focus();
                        return true;
                        break;
                    case Keys.F9:
                    case Keys.Alt | Keys.H:
                        cmbMaHang.Focus();
                        cmbMaHang.Select();
                        if (txtMaHang.Visible)
                        {
                            txtMaHang.Focus();
                            txtMaHang.SelectAll();
                        }
                        return true;
                        break;
                    case Keys.Control | Keys.Shift | Keys.Alt | Keys.R:
                        ReadFromExcel();
                        return true;
                        break;
                    case Keys.Control | Keys.Shift | Keys.Alt | Keys.E:
                        ExportExcel();
                        //ExportExcelFullInfo();
                        return true;
                        break;
                    case Keys.Control | Keys.F:
                        cmbTheThanhVien.Focus();
                        cmbTheThanhVien.Select();
                        //ExportExcelFullInfo();
                        return true;
                        break;
                    case Keys.F11:
                        if (_EditState == EditState.CreatingNew || _EditState == EditState.Modifying)
                            TruSoLuongBangPhimTat();
                        return true;
                        break;
                    case Keys.Enter:
                        Control focusControl = base.FindFocusedControl(this);
                        if (focusControl.Parent.Name == "txtMaHang")
                        {
                            ChooseHangHoaByEnterKey(13);  //Enter
                            return true;
                        }
                        break;
                    default:
                        return base.ProcessCmdKey(ref msg, keyData);
                        break;
                }
            }
            catch (Exception ex)
            {
                BasicForms.FrmExceptionNotifier.ShowAndLog(ex);
            }
            return base.ProcessCmdKey(ref msg, keyData);
        }

        private void btnExportToExcel_Click(object sender, EventArgs e)
        {
            contextMenuStripExportExcel.Show(btnExportToExcel, new Point(0, 0));
        }
        private void danhSáchTrongHoaToolStripMenuItem_Click(object sender, EventArgs e)
        {
            ExportExcelFullInfo();
        }
        private void mẫuNhậpExcelCủaPhầnMềmToolStripMenuItem_Click(object sender, EventArgs e)
        {
            ExportExcel();
        }
        protected void ExportExcel()
        {
            #region Preparing Data
            DataSet ds = new DataSet();
            ExportToExcel.PreparingTableForExportExcel(ref ds);
            DataTable dtDanhMuc = ds.Tables["DanhMucHangHoa"];
            DataTable dtMauNhapHoaDon = ds.Tables["MauNhapHoaDon"];
            //dua du lieu vao DataTable
            string ma = ""; string maNhom = ""; string ten = ""; string dvTinh = ""; string TacGia = ""; string NXB = "";
            string NguonCungCap = ""; string GhiChu = "";
            decimal CKBanLe = 0, CKmua = 0, CKBanBuon = 0;
            decimal soLuong = 0, giaNhap = 0, CKMuaTrongHoaDon = 0, giaBia = 0;

            foreach (DataRow row in _GridDataSouce.Rows)
            {
                VatTuHangHoa vthh = DanhMucVatTuHangHoa.Instance.GetByID((Guid)row["VatTuHangHoa1ID"]);
                if (vthh != null)
                {
                    ma = vthh.Ma;
                    maNhom = DanhMucNhomVatTuHangHoa.Instance.GetByID((Guid)DanhMucVatTuHangHoa.Instance.GetByID((Guid)row["VatTuHangHoa1ID"]).NhomVatTuHangHoa.ID).Ma;
                    ten = DanhMucVatTuHangHoa.Instance.GetByID((Guid)row["VatTuHangHoa1ID"]).Ten;
                    giaBia = (decimal)row["Value12"]; //gia bia(or gia mac dinh)
                    ////CKBanLe = vthh.ChietKhauBanLe;
                    ////CKmua = vthh.ChietKhauMua;            Khach hang tu nhap danh muc nay.
                    ////CKBanBuon = (decimal)row["Value8"];
                    //dvTinh = vthh.DonViTinh.Trim();
                    //TacGia = vthh.TacGia.Trim();
                    //NXB = vthh.NhaXuatBan.Trim();
                    //NguonCungCap = vthh.NguonCungCap.Trim();
                    //GhiChu = vthh.GhiChu.Trim();

                    soLuong = (decimal)row["Value1"];
                    giaNhap = (decimal)row["Value6"]; //dongia thanh toán
                    CKMuaTrongHoaDon = (decimal)row["Value8"];

                    //try
                    //{
                    //    dtDanhMuc.Rows.Add(ma, maNhom, ten, giaBia, (decimal)CKBanLe, (decimal)CKmua, (decimal)CKBanBuon, dvTinh, TacGia, NXB, NguonCungCap, GhiChu);
                    //}
                    //catch (Exception ex)
                    //{
                    //    throw new Exception(ex.Message);
                    //}
                    try
                    {
                        dtMauNhapHoaDon.Rows.Add(ma, soLuong, giaNhap, CKMuaTrongHoaDon);
                    }
                    catch (Exception ex)
                    {
                        throw new Exception(ex.Message);
                    }
                }
                else
                {

                }
            }
            //Get fileName
            string fileName = string.Format("{0}-{1}-{2}", txtSo.Text, Config.TenDoanhNghiep, cmbDoiTuong.Text);
            #endregion

            try
            {
                BasicForms.FrmProgressBar.StartShowProgress();
                ExportToExcel.ExportDataToExcel(dtMauNhapHoaDon, fileName);
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
            finally
            {
                BasicForms.FrmProgressBar.FinishShowProgress();
            }
        }
        protected void ExportExcelFullInfo()
        {
            DataTable dtKhoanMucChungTu = null;
            if (!DanhMucStore.Instance.CurrentStore().Ten.ToUpper().Contains("TTSHN"))
            {
                #region Preparing Data common
                DataSet ds = new DataSet();
                ExportToExcel.PreparingTableForExportExcel(ref ds);
                dtKhoanMucChungTu = ds.Tables["KhoanMucChungTu"];
                //dua du lieu vao DataTable
                string ma = ""; string ten = ""; string dvTinh = "";
                decimal soLuong = 0, giaBia = 0, chietKhau = 0, donGiaThanhToan = 0, thanhTienThanhToan = 0;

                foreach (DataRow row in _GridDataSouce.Rows)
                {
                    try
                    {
                        VatTuHangHoa vthh = DanhMucVatTuHangHoa.Instance.GetByID((Guid)row["VatTuHangHoa1ID"]);
                        ma = vthh.Ma;
                        ten = DanhMucVatTuHangHoa.Instance.GetByID((Guid)row["VatTuHangHoa1ID"]).Ten;
                        dvTinh = vthh.DonViTinh;
                        soLuong = (decimal)row["Value1"];
                        giaBia = (decimal)row["Value12"]; //gia bia(or gia mac dinh)
                        chietKhau = (decimal)row["Value8"];
                        donGiaThanhToan = (decimal)row["Value6"];
                        thanhTienThanhToan = (decimal)row["Value7"];

                        dtKhoanMucChungTu.Rows.Add(ma, ten, dvTinh, soLuong, giaBia, chietKhau, donGiaThanhToan, thanhTienThanhToan);
                    }
                    catch (Exception ex)
                    {
                        throw new Exception(ex.Message);
                    }
                }
                //Tính tổng cuối hóa đơn
                dtKhoanMucChungTu.Rows.Add(null, "Tổng:", null, null, null, null, null, _ChungTu.SoTienNT);
                #endregion
            }
            else
            {
                #region Preparing Data common
                DataSet ds = new DataSet();
                ExportToExcel.PreparingTableForExportExcel(ref ds);
                dtKhoanMucChungTu = ds.Tables["KhoanMucChungTuVanViet"];
                //dua du lieu vao DataTable
                string ma = ""; string ten = ""; string dvTinh = "";
                decimal soLuong = 0, giaBia = 0, chietKhau = 0, donGiaThanhToan = 0, thanhTienThanhToan = 0;

                foreach (DataRow row in _GridDataSouce.Rows)
                {
                    try
                    {
                        VatTuHangHoa vthh = DanhMucVatTuHangHoa.Instance.GetByID((Guid)row["VatTuHangHoa1ID"]);
                        ma = vthh.Ma;
                        ten = DanhMucVatTuHangHoa.Instance.GetByID((Guid)row["VatTuHangHoa1ID"]).Ten;
                        soLuong = (decimal)row["Value1"];
                        giaBia = (decimal)row["Value12"]; //gia bia(or gia mac dinh)
                        chietKhau = (decimal)row["Value8"];
                        donGiaThanhToan = (decimal)row["Value6"];
                        thanhTienThanhToan = (decimal)row["Value7"];

                        dtKhoanMucChungTu.Rows.Add(ma, ten, soLuong, giaBia, chietKhau, donGiaThanhToan, thanhTienThanhToan);
                    }
                    catch (Exception ex)
                    {
                        throw new Exception(ex.Message);
                    }
                }
                //Tính tổng cuối hóa đơn
                dtKhoanMucChungTu.Rows.Add(null, "Tổng:", null, null, null, null, _ChungTu.SoTienNT);
                #endregion
            }

            DoiTuongNghiepVu doiTac = DanhMucDoiTuongNghiepVu.Instance.GetByID(_ChungTu.DoiTuongNghiepVu1ID);
            string[] tieuDe =
                new string[] { DanhMucLoaiChungTu.Instance.GetByID(_ChungTu.LoaiChungTuID).Ten.ToUpper(), 
                                string.Format("Số: {0} - Ngày: {1}", _ChungTu.So, _ChungTu.Ngay.ToVnFormat()),
                                string.Format("Đối tác: {0}", doiTac.Ten)};

            string fileName = string.Format("{0}-{1}-{2}", txtSo.Text, Config.TenDoanhNghiep, cmbDoiTuong.Text);
            try
            {
                BasicForms.FrmProgressBar.StartShowProgress();
                ExportToExcel.ExportDataToExcel(tieuDe, dtKhoanMucChungTu, fileName);
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
            finally
            {
                BasicForms.FrmProgressBar.FinishShowProgress();
            }
        }

        private void ReadFromExcel()
        {
            try
            {
                OpenFileDialog openFileDialog = new OpenFileDialog();
                openFileDialog.Filter = "Excel file|*.xlsx;*.xls";
                if (openFileDialog.ShowDialog() == DialogResult.OK)
                {
                    BasicForms.FrmProgressBar.StartShowProgress();

                    string path = openFileDialog.FileName;
                    Excel.ApplicationClass app = new Microsoft.Office.Interop.Excel.ApplicationClass();
                    Excel.Workbook workBook = app.Workbooks.Open(path, 0, true, 5, "", "", true, Excel.XlPlatform.xlWindows, "\t",
                                    false, false, 0, true, 1, 0);
                    Excel.Worksheet workSheet = (Excel.Worksheet)workBook.ActiveSheet;
                    Excel.Range range = workSheet.UsedRange;

                    if (range.Columns.Count >= 4)
                    {
                        Hashtable htHangKhongHople = new Hashtable();
                        for (int rowIndex = 2; rowIndex <= range.Rows.Count; rowIndex++)
                        {
                            try
                            {
                                string maHang = "";
                                decimal soLuong = 0;
                                decimal donGia = 0;
                                decimal chietKhauMua = 0;
                                VatTuHangHoa hanghoa = null;

                                #region Doc cac o du lieu tu Excel va Check hop le
                                try
                                {
                                    maHang = (range.Cells[rowIndex, 2] as Excel.Range).Text.ToString().Trim();
                                }
                                catch (Exception ex)
                                {
                                }
                                try
                                {
                                    soLuong = Convert.ToDecimal((range.Cells[rowIndex, 3] as Excel.Range).Value2.ToString().Trim());
                                }
                                catch (Exception ex)
                                {
                                }
                                try
                                {
                                    donGia = decimal.Parse((range.Cells[rowIndex, 4] as Excel.Range).Value2.ToString().Trim());
                                }
                                catch (Exception ex)
                                {
                                }
                                try
                                {
                                    chietKhauMua = decimal.Parse((range.Cells[rowIndex, 5] as Excel.Range).Value2.ToString().Trim());
                                }
                                catch (Exception ex)
                                {
                                }
                                try
                                {
                                    hanghoa = Lists.DanhMucVatTuHangHoa.Instance.GetByProperty("Ma", maHang);
                                }
                                catch (Exception ex)
                                {
                                }

                                if (maHang == "" && soLuong != 0 && donGia != 0)
                                {
                                    MessageBox.Show(string.Format("Mã hàng ở dòng số {0} không hợp lệ", rowIndex - 2));
                                    continue;
                                }
                                #endregion

                                if (maHang != "" && hanghoa != null)
                                {
                                    DataRow row = _ChungTu.DanhSachChungTuPhuThuoc[0].DanhSachKhoanMuc.DataTable.NewRow();
                                    row["VatTuHangHoa1ID"] = hanghoa.ID;
                                    row["Value1"] = soLuong;
                                    row["Value4"] = donGia;
                                    row["Value8"] = chietKhauMua;
                                    row["Value12"] = hanghoa.GiaBia;
                                    _ChungTu.DanhSachChungTuPhuThuoc[0].DanhSachKhoanMuc.DataTable.Rows.Add(row);
                                }
                                else
                                {
                                    if (!htHangKhongHople.ContainsKey(maHang)) htHangKhongHople.Add(maHang, null);
                                }
                            }
                            catch (SqlException sqlEx)
                            {
                                throw new CustomException(CustomException.GetSqlExceptionMessage(sqlEx));
                            }
                            catch (Exception ex)
                            {
                                if (ex is CustomException) throw ex;
                                else
                                {
                                    throw new Exception(ex.Message);
                                }
                            }
                        }
                    }
                    workBook.Close(false, path, true);
                }
            }
            catch (SqlException sqlEx)
            {
                throw new CustomException(CustomException.GetSqlExceptionMessage(sqlEx));
            }
            catch (Exception ex)
            {
                if (ex is CustomException) throw ex;
                else
                {
                    throw new Exception(ex.Message);
                }
            }
            finally
            {
                FillTongCong();
                BasicForms.FrmProgressBar.FinishShowProgress();
            }
        }

        private void Edit()
        {
            try
            {
                //Không cho phép sửa hóa đơn đã quá hạn
                if (Config.SoNgayDuocPhepSuaHoaDon > 0) //Nếu lớn hơn bằng 0 là có hạn cho việc sửa hóa đơn chứng từ đã tạo trước đó
                {
                    //nếu là Supadmin hoặc nhóm admin thì cho sửa. Ngoài ra là không cho sửa
                    if (CustomSecurity.User.CurUser.UserName != "SupAdmin" && !CustomSecurity.User.CurUser.RoleList.ContainsKey("Admin")
                        && !CustomSecurity.User.CurUser.RoleList.ContainsValue("Admin"))
                    {
                        DateTime ngayHoaDon = Convert.ToDateTime(_ChungTu.Ngay.Date.ToString("dd/MM/yyyy"));    //Đưa về 0h giờ để chỉ so sánh ngày
                        DateTime toDay = Convert.ToDateTime(DateTime.Now.ToString("dd/MM/yyyy"));
                        if (ngayHoaDon.AddDays((int)Config.SoNgayDuocPhepSuaHoaDon) < toDay)
                            throw new CustomException(string.Format("Hạn sửa lại hóa đơn - chứng từ là {0} ngày. Hóa đơn - chứng từ này đã hết hạn. Liên hệ với quản lý để biết thêm thông tin.", Config.SoNgayDuocPhepSuaHoaDon), ExceptionType.LackOfInputInfo);
                    }
                }
                else if (Config.SoNgayDuocPhepSuaHoaDon == 0)
                {
                    //nếu là Supadmin hoặc nhóm admin thì cho sửa. Ngoài ra là không cho sửa
                    if (CustomSecurity.User.CurUser.UserName != "SupAdmin" && !CustomSecurity.User.CurUser.RoleList.ContainsKey("Admin")
                        && !CustomSecurity.User.CurUser.RoleList.ContainsValue("Admin"))
                    {
                        DateTime ngayHoaDon = Convert.ToDateTime(_ChungTu.Ngay.Date.ToString("dd/MM/yyyy"));    //Đưa về 0h giờ để chỉ so sánh ngày
                        DateTime toDay = Convert.ToDateTime(DateTime.Now.ToString("dd/MM/yyyy"));
                        if (ngayHoaDon.AddDays((int)Config.SoNgayDuocPhepSuaHoaDon) <= toDay)
                            throw new CustomException(string.Format("Hạn sửa lại hóa đơn - chứng từ là {0} ngày. Hóa đơn - chứng từ này đã hết hạn. Liên hệ với quản lý để biết thêm thông tin.", Config.SoNgayDuocPhepSuaHoaDon), ExceptionType.LackOfInputInfo);
                    }
                }

                BasicForms.FrmProgressBar.StartShowProgress();
                _ChungTu.BoGhiSo();

                _ChungTu.DanhSachChungTuPhuThuoc[0].DanhSachKhoanMuc.DataTable.ColumnChanged += new DataColumnChangeEventHandler(DataTable_ColumnChanged);
                _ChungTu.DanhSachChungTuPhuThuoc[0].DanhSachKhoanMuc.DataTable.RowChanged += new DataRowChangeEventHandler(DataTable_RowChanged);
                _ChungTu.DanhSachChungTuPhuThuoc[0].DanhSachKhoanMuc.DataTable.RowDeleted += new DataRowChangeEventHandler(DataTable_RowDeleted);

                cmbMaHang.EditValue = null;
                SetEditState(GeneralLibs.EditState.Modifying);
            }
            catch (SqlException sqlEx)
            {
                throw new CustomException(CustomException.GetSqlExceptionMessage(sqlEx));
            }
            catch (Exception ex)
            {
                if (ex is CustomException) throw ex;
                else
                {
                    throw new Exception(ex.Message);
                }
            }
            finally
            {
                BasicForms.FrmProgressBar.FinishShowProgress();
            }
        }

        private void Reset()
        {
            try
            {
                //Kiểm tra hóa đơn xem đã lưu chưa và trợ giúp
                int countKhoanMuc = 0;
                if (customGridKhoanMuc.DataSource is DataTable) countKhoanMuc = (customGridKhoanMuc.DataSource as DataTable).Rows.Count;

                bool allowReset = true;

                //Check xóa hàng quét thẻ
                if ((_EditState == EditState.Modifying || _EditState == EditState.CreatingNew) && countKhoanMuc > 0)
                {
                    if (Config.MoXoaHangCanQuetThe == DuocPhepMoXoaHangCanQuetThe.DuocPhep)
                    {
                        if (CustomSecurity.User.CurUser.RoleList.Contains("Admin") || CustomSecurity.User.CurUser.UserName == "SupAdmin")
                        {
                            allowReset = true;
                        }
                        else
                        {
                            FrmVerifiedPassword frm = new FrmVerifiedPassword();
                            if (frm.ShowDialog() == DialogResult.OK)
                                allowReset = true;
                            else
                                allowReset = false;
                        }
                    }
                    else  //Nếu các store khác thì không cần
                    {
                        allowReset = true;
                    }
                }

                if (allowReset == false) return;

                if (Config.KiemTraHoaDonBanLeKhongLuu == KiemTraHoaDonBanLeKhongLuu.DuocPhep && !_ChungTu.GhiSo && countKhoanMuc > 0)
                {
                    if (MessageBox.Show("Chứng từ này chưa ghi sổ. Bạn có muốn ghi sổ không?", "Cảnh báo", MessageBoxButtons.YesNo) == DialogResult.Yes)
                    {
                        if (!Save())
                        {
                            return;
                        }
                    }
                    else //nếu vẫn không lưu thì ghi nhật ký
                    {
                        ChungTu phieuXuatKhoForList = _ChungTu.DanhSachChungTuPhuThuoc[0];
                        string listHangHoa = "";
                        foreach (KhoanMucChungTu khoanMuc in phieuXuatKhoForList.DanhSachKhoanMuc)
                        {
                            VatTuHangHoa vthh = DanhMucVatTuHangHoa.Instance.GetByID(khoanMuc.VatTuHangHoa1ID);
                            if (vthh != null)
                            {
                                listHangHoa += vthh.Ten + " | ";
                            }
                        }

                        NhatKySuDung.Insert2DB("Xóa ", string.Format("HĐBL: {0}, Thành tiền = {1} VNĐ (Gồm: {2}) mà không lưu",
                            txtSo.Text.Trim(), txtTongSoTien.Text.Trim(), listHangHoa));
                    }

                }

                //reset các biến
                BasicForms.FrmProgressBar.StartShowProgress();
                DoiTuongNghiepVu khachLe = DanhMucDoiTuongNghiepVu.GetDanhMucKhachHang().GetByTen("Khách lẻ");
                if (khachLe != null)
                {
                    cmbDoiTuong.EditValue = khachLe.ID;
                }

                cmbMaHang.Focus();
                _ChungTu = _DanhSachChungTu.CreateNew(DanhMucLoaiChungTu.Instance.GetByMa("HoaDonBanLe"));
                _ChungTu.LoadDanhSachChungTuPhuThuoc();
                ChungTu phieuXuatKho = _ChungTu.DanhSachChungTuPhuThuoc.CreateNew(DanhMucLoaiChungTu.Instance.GetByMa("PhieuXuatKho"));
                chkThanhToanQuaThe.Checked = false; //Thanh toán qua thẻ

                Store store = DanhMucStore.Instance.GetByStoreID(Config.StoreID);
                Kho khoXuat = null;
                if (cmbKho.EditValue is Guid)
                {
                    khoXuat = DanhMucKho.Instance.GetByID((Guid)cmbKho.EditValue);

                    if (store.Ten.ToUpper().Contains("VIETBOOK"))
                        if (khoXuat != null)
                            phieuXuatKho.So = this.GenerateSoChungTuFromConfigInCauHinhKhac(DanhMucLoaiChungTu.Instance.GetByMa("PhieuXuatKho").ID, khoXuat.Ma + "PXBL", 7, true);
                        else
                            phieuXuatKho.So = this.GenerateSoChungTuFromConfigInCauHinhKhac(DanhMucLoaiChungTu.Instance.GetByMa("PhieuNhapKho").ID, khoXuat.Ma + "PNBL", 7, true);
                    else
                        if (khoXuat != null)
                            phieuXuatKho.So = this.GenerateSoChungTuFromConfigInCauHinhKhac(DanhMucLoaiChungTu.Instance.GetByMa("PhieuXuatKho").ID, khoXuat.Ma + "/XL" + @"/", 7, true);
                        else
                            phieuXuatKho.So = this.GenerateSoChungTuFromConfigInCauHinhKhac(DanhMucLoaiChungTu.Instance.GetByMa("PhieuNhapKho").ID, "XL", 7, true);
                }

                _ChungTu.DanhSachChungTuPhuThuoc.Add(phieuXuatKho);

                #region Bound data for customGridKhoanMuc
                phieuXuatKho.LoadKhoanMuc();
                customGridKhoanMuc.DataSource = phieuXuatKho.DanhSachKhoanMuc.DataTable;
                _ChungTu.DanhSachChungTuPhuThuoc[0].DanhSachKhoanMuc.DataTable.ColumnChanged += new DataColumnChangeEventHandler(DataTable_ColumnChanged);
                _ChungTu.DanhSachChungTuPhuThuoc[0].DanhSachKhoanMuc.DataTable.RowChanged += new DataRowChangeEventHandler(DataTable_RowChanged);
                _ChungTu.DanhSachChungTuPhuThuoc[0].DanhSachKhoanMuc.DataTable.RowDeleted += new DataRowChangeEventHandler(DataTable_RowDeleted);
                #endregion

                cmbMaHang.EditValue = null;

                if (store.Ten.ToUpper().Contains("VIETBOOK"))  // Nếu không là cty sách HN VietBook thì chỉ hiển thị thông báo
                {
                    if (khoXuat != null)
                        txtSo.Text = this.GenerateSoChungTuFromConfigInCauHinhKhac(DanhMucLoaiChungTu.Instance.GetByMa("HoaDonBanLe").ID, khoXuat.Ma + "BL", 7, true);
                    else
                        txtSo.Text = this.GenerateSoChungTuFromConfigInCauHinhKhac(DanhMucLoaiChungTu.Instance.GetByMa("HoaDonBanLe").ID, true);
                }
                else
                    txtSo.Text = this.GenerateSoChungTuFromConfigInCauHinhKhac(DanhMucLoaiChungTu.Instance.GetByMa("HoaDonBanLe").ID, true);

                dateNgay.EditValue = GeneralLibs.CommonLib.GetSystemDateTime();
                txtTongSoLuong.EditValue = (decimal)0;
                txtTongChietKhau.EditValue = (decimal)0;
                txtTongGiaBia.EditValue = (decimal)0;
                txtTongSoTien.EditValue = (decimal)0;
                txtSoTienKhachDua.EditValue = (decimal)0;
                txtSoTienTraLai.EditValue = (decimal)0;
                _ChungTu.GhiSo = false;

                //Reset lại thông tin hiển thị thẻ thành viên, để phía duwois k có dữ liệu thì k hiện lung tung
                cmbTheThanhVien.EditValue = 0;
                lblMaThe.Text = "";
                lblHoTen.Text = "";
                lblDienThoai.Text = "";
                lblCMND.Text = "";

                SetEditState(GeneralLibs.EditState.CreatingNew);
                BasicForms.FrmProgressBar.FinishShowProgress();
            }
            catch (SqlException sqlEx)
            {
                throw new CustomException(CustomException.GetSqlExceptionMessage(sqlEx));
            }
            catch (Exception ex)
            {
                if (ex is CustomException) throw ex;
                else
                {
                    throw new Exception(ex.Message);
                }
            }
        }

        protected void SaveAndPrint()
        {
            try
            {
                if (_EditState == EditState.CreatingNew || _EditState == EditState.Modifying)
                {
                    if (Save())
                        Print();
                }
            }
            catch (SqlException sqlEx)
            {
                throw new CustomException(CustomException.GetSqlExceptionMessage(sqlEx));
            }
            catch (Exception ex)
            {
                if (ex is CustomException) throw ex;
                else
                {
                    throw new Exception(ex.Message);
                }
            }
        }
        protected void SaveAndPrintForeignLanguage()
        {
            try
            {
                if (DanhMucStore.Instance.CurrentStore().Ten.ToUpper().Contains("VIETBOOK"))
                {
                    if (_EditState == EditState.CreatingNew || _EditState == EditState.Modifying)
                    {
                        if (Save())
                        {
                            PrintForeignLanguage(false);
                            PrintForeignLanguage(false);
                        }
                    }
                    else
                    {
                        PrintForeignLanguage(false);
                        PrintForeignLanguage(false);
                    }
                }
                else if (_EditState == EditState.CreatingNew || _EditState == EditState.Modifying)
                {
                    if (Save())
                        PrintForeignLanguage(false);
                }
            }
            catch (SqlException sqlEx)
            {
                throw new CustomException(CustomException.GetSqlExceptionMessage(sqlEx));
            }
            catch (Exception ex)
            {
                if (ex is CustomException) throw ex;
                else
                {
                    throw new Exception(ex.Message);
                }
            }
        }

        protected bool CheckTienThuaThieu()
        {
            try
            {
                if (txtSoTienKhachDua.EditValue is decimal && txtTongSoTien.EditValue is decimal)
                {
                    if (Math.Round((decimal)txtSoTienKhachDua.EditValue, 0) >= Math.Round((decimal)txtTongSoTien.EditValue, 0))
                    {
                        return true;
                    }
                    else
                    {
                        return false;
                    }
                }
                else
                {
                    return false;
                }
            }
            catch (SqlException sqlEx)
            {
                throw new CustomException(CustomException.GetSqlExceptionMessage(sqlEx));
            }
            catch (Exception ex)
            {
                if (ex is CustomException) throw ex;
                else
                {
                    throw new Exception(ex.Message);
                }
            }

        }

        private void KhuyenMaiTheoTongTienHoaDon()
        {
            try
            {
                Store store = DanhMucStore.Instance.GetByStoreID(Config.StoreID);
                string _TenStoreUpper = store.Ten.ToUpper();
                if (_EditState != EditState.CreatingNew) return;

                if (Config.MoChietKhauTheoTongTienHoaDon == DuocPhepMoChietKhauTheoTongTienHoaDon.DuocPhep)
                {
                    decimal tongSoTien = 0;
                    if (txtTongSoTien.EditValue != null && txtTongSoTien.EditValue is decimal)
                        tongSoTien = (decimal)txtTongSoTien.EditValue;

                    if (500000 <= tongSoTien && tongSoTien <= 1000000)
                    {
                        foreach (KhoanMucChungTu khoanMuc in _ChungTu.DanhSachChungTuPhuThuoc[0].DanhSachKhoanMuc)
                        {
                            khoanMuc.Value8 = 5;
                        }
                    }
                    else if (1000000 < tongSoTien && tongSoTien <= 3000000)
                    {
                        foreach (KhoanMucChungTu khoanMuc in _ChungTu.DanhSachChungTuPhuThuoc[0].DanhSachKhoanMuc)
                        {
                            khoanMuc.Value8 = 10;
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        protected bool Save()
        {
            try
            {
                btnSave.Focus();    //Để lost focus khỏi grid --> đồng bộ giữa DataTable và Grid

                //CheckXuatHangAm();
                if (!_AllowSave)    //Nếu cờ cho phép lưu tắt
                {
                    _AllowSave = true;  //Đã kiểm tra xong, đưa cờ cho phép lưu về giá trị true
                    cmbMaHang.Focus(); //Focus trở lại cmbMaHang để nhập tiếp hàng
                    return false;   //k cho lưu
                }

                FillTongCong();
                if (Config.DuocLuuHDBLKhiKhahDuaThieuTien == DuocLuuHDBLKhiKhahDuaThieuTienHayKhong.KhongDuocPhep &&
                    !CheckTienThuaThieu())
                {
                    MessageBox.Show("Tiền khách đưa chưa đủ.\nCần thu thêm tiền.");
                    txtSoTienKhachDua.SelectAll();
                    txtSoTienKhachDua.Focus();
                    return false;
                }

                try
                {
                    DoiTuongNghiepVu dt1 = DanhMucDoiTuongNghiepVu.Instance.GetByID(_ChungTu.DoiTuongNghiepVu1ID);
                    DoiTuongNghiepVu dt2 = DanhMucDoiTuongNghiepVu.Instance.GetByID(_ChungTu.DoiTuongNghiepVu2ID);
                    if (dt1 != null && dt1.Ma is string) _ChungTu.MaDoiTuongNghiepVu1 = dt1.Ma;
                    if (dt2 != null && dt2.Ma is string) _ChungTu.MaDoiTuongNghiepVu2 = dt2.Ma;

                    if (!CheckFullInfo()) return false;
                    _ChungTu.So = txtSo.Text;
                    if (CommonLib.StartWithSoMay(txtSo.Text)) _ChungTu.SoKhongKemSoMay = CommonLib.CutSoMayWithOutSoChungTu(txtSo.Text);
                    else _ChungTu.SoKhongKemSoMay = txtSo.Text;
                    _ChungTu.Ngay = new NullableDate(dateNgay.DateTime);
                    _ChungTu.DoiTuongNghiepVu1ID = (Guid)cmbDoiTuong.EditValue;
                    _ChungTu.TenNguoiThucHien = DanhMucDoiTuongNghiepVu.Instance.GetByID(_ChungTu.DoiTuongNghiepVu1ID).Ten;
                    _ChungTu.TaiKhoan1ID = (Guid)DanhMucCauHinhTaiKhoanMacDinh.Instance.GetTaiKhoanIDByTinhChat("BanLe_NoTienThuVe");
                    _ChungTu.TaiKhoan2ID = (Guid)DanhMucCauHinhTaiKhoanMacDinh.Instance.GetTaiKhoanIDByTinhChat("VatDauRa");
                    _ChungTu.TaiKhoan4ID = (Guid)DanhMucCauHinhTaiKhoanMacDinh.Instance.GetTaiKhoanIDByTinhChat("BanLe_CoDoanhThu");
                    _ChungTu.ThueSuat1ID = (Guid)cmbThueSuat.EditValue;
                    _ChungTu.TienTeID = DanhMucTienTe.Instance.GetTienHoachToan().ID;
                    _ChungTu.TyGiaThucTe = 1;
                    _ChungTu.Kho1ID = (Guid)cmbKho.EditValue;
                    _ChungTu.TrueFalse1 = chkThanhToanQuaThe.Checked;

                    _ChungTu.SoTienNT = _ChungTu.SoTienQD = (decimal)txtTongSoTien.EditValue;   //tien phai thanh toan
                    if (txtSoTienKhachDua.EditValue is decimal) _ChungTu.Value2 = (decimal)txtSoTienKhachDua.EditValue;         //tien dua
                    _ChungTu.Value3 = _ChungTu.Value2 - _ChungTu.SoTienNT;          //tien thua
                    decimal thueSuat = DanhMucThueSuat.Instance.GetByID(_ChungTu.ThueSuat1ID).MucThueSuat;
                    _ChungTu.Value6 = _ChungTu.SoTienQD / (1 + thueSuat); //tien hang
                    _ChungTu.Value5 = _ChungTu.SoTienQD * thueSuat / (1 + thueSuat);//tien thue VAT
                    _ChungTu.Value13 = (decimal)txtTongGiaBia.EditValue;             //gia bia
                    _ChungTu.Value11 = (decimal)txtTongSoLuong.EditValue;            //so luong
                    _ChungTu.Value8 = (decimal)txtTongChietKhau.EditValue;          //tien chiet khau

                    //Ghi thẻ thành viên nếu có
                    if (lblMaThe.Text.Trim() != "" && lblMaThe.Text.Trim() != "Không tìm thấy thẻ thành viên nào có thông tin như trên")
                    {
                        //Lấy ra mã thẻ
                        string maThe = lblMaThe.Text.Trim().Replace("Mã thẻ: ", "");
                        _ChungTu.MaTheThanhVien = maThe;
                    }

                    _ChungTu.GhiSo = true;

                    ChungTu phieuXuatKho = _ChungTu.DanhSachChungTuPhuThuoc[0];
                    phieuXuatKho.LoaiChungTuID = DanhMucLoaiChungTu.Instance.GetByMa("PhieuXuatKho").ID;
                    phieuXuatKho.DinhKhoan = false;

                    BasicForms.FrmProgressBar.StartShowProgress();
                    BasicForms.FrmProgressBar.Status = "Đang tính giá vốn hàng xuất kho";
                    try
                    {
                        foreach (KhoanMucChungTu khoanMuc in phieuXuatKho.DanhSachKhoanMuc)
                        {
                            khoanMuc.Value2 = VatTuHangHoa.CalculateGiaXuatKho(khoanMuc.VatTuHangHoa1ID, (Guid)cmbKho.EditValue, dateNgay.DateTime, khoanMuc.Value1);

                            //Nếu là TTSHN thì tính thuế kiểu tự động như giá vốn, các nơi khác tính bình thường
                            if (DanhMucStore.Instance.CurrentStore().Ten.ToUpper().Contains("TTSHN")
                                || DanhMucStore.Instance.CurrentStore().Ten.ToUpper().Contains("MINH"))
                            {
                                decimal thueSuatXuat = 0;

                                ////Thuế suất tính theo nhập trước xuất trước. Nhưng khóa sổ lại bị sai
                                //VatTuHangHoa.CalculateThueXuatKho((Guid)row["VatTuHangHoa1ID"], (Guid)cmbKho.EditValue, dateNgay.DateTime, (decimal)row["Value1"]);

                                //Tính theo thuế đầu vào. 1 hàng có thuế đầu vào là X thì luôn luôn là X
                                VatTuHangHoa.CalculateThueNhapKhoByHangHoa(khoanMuc.VatTuHangHoa1ID, (Guid)cmbKho.EditValue);
                                khoanMuc.Value4 = khoanMuc.Value6 / (1 + thueSuatXuat);
                            }
                        }
                    }
                    catch (SqlException sqlEx)
                    {
                        throw new CustomException(CustomException.GetSqlExceptionMessage(sqlEx));
                    }
                    catch (Exception ex)
                    {
                        if (ex is CustomException) throw ex;
                        else
                        {
                            throw new Exception(ex.Message);
                        }
                    }
                    BasicForms.FrmProgressBar.FinishShowProgress();

                    if (dt1 != null && dt1.Ma is string) phieuXuatKho.MaDoiTuongNghiepVu1 = dt1.Ma;
                    if (dt2 != null && dt2.Ma is string) phieuXuatKho.MaDoiTuongNghiepVu2 = dt2.Ma;

                    phieuXuatKho.Ngay = _ChungTu.Ngay;
                    phieuXuatKho.SoChungTuGoc = txtSo.Text;
                    phieuXuatKho.DoiTuongNghiepVu1ID = (Guid)cmbDoiTuong.EditValue;
                    phieuXuatKho.TenNguoiThucHien = cmbDoiTuong.Text;
                    phieuXuatKho.DienGiai = "Xuất kho bán lẻ";
                    phieuXuatKho.TaiKhoan1ID = (Guid)DanhMucCauHinhTaiKhoanMacDinh.Instance.GetTaiKhoanIDByTinhChat("BanLe_NoGiaVon");
                    phieuXuatKho.TaiKhoan2ID = (Guid)DanhMucCauHinhTaiKhoanMacDinh.Instance.GetTaiKhoanIDByTinhChat("BanLe_CoXuatKho");
                    phieuXuatKho.TienTeID = _ChungTu.TienTeID;
                    phieuXuatKho.TyGiaThucTe = _ChungTu.TyGiaThucTe;
                    phieuXuatKho.TrueFalse1 = chkThanhToanQuaThe.Checked;

                    phieuXuatKho.Kho1ID = (Guid)cmbKho.EditValue;
                    phieuXuatKho.DangXuatID = DanhMucDangXuat.Instance.GetByProperty("IsBuildInRecord", true).ID;
                    if (CommonLib.StartWithSoMay(phieuXuatKho.So)) phieuXuatKho.SoKhongKemSoMay = CommonLib.CutSoMayWithOutSoChungTu(phieuXuatKho.So);
                    else phieuXuatKho.SoKhongKemSoMay = phieuXuatKho.So;

                    phieuXuatKho.SoTienNT = 0;
                    foreach (KhoanMucChungTu khoanMuc in phieuXuatKho.DanhSachKhoanMuc)
                    {
                        if (khoanMuc.DataRow["Value3"] is decimal) phieuXuatKho.SoTienNT += khoanMuc.Value3;
                    }
                    phieuXuatKho.SoTienQD = phieuXuatKho.SoTienNT;

                    //Làm riêng cho cty sách HN, cần in cả thuế ở Phiếu xuất kho
                    Store store = DanhMucStore.Instance.GetByStoreID(Config.StoreID);
                    if (store.Ten.ToUpper().Contains("VIETBOOK"))
                    {
                        phieuXuatKho.ThueSuat1ID = _ChungTu.ThueSuat1ID;
                        phieuXuatKho.Value5 = _ChungTu.Value5; //Đưa tiền thuế lưu cả vào phiếu
                        phieuXuatKho.Value1 = _ChungTu.Value1; //Lấy tổng tiền hàng
                        phieuXuatKho.Value13 = _ChungTu.Value13; //gia bia

                        phieuXuatKho.DienGiai = _ChungTu.DienGiai;
                    }

                    try
                    {
                        for (int i = 0; i < customGridKhoanMuc.gridViewKhoanMuc.DataRowCount; i++)
                        {
                            DataRow row = customGridKhoanMuc.gridViewKhoanMuc.GetDataRow(i);
                            foreach (KhoanMucChungTu khoanMuc in phieuXuatKho.DanhSachKhoanMuc)
                            {
                                if (khoanMuc.VatTuHangHoa1ID == (Guid)row["VatTuHangHoa1ID"] && khoanMuc.ThuTuKhoanMucTrongChungTu != i) khoanMuc.ThuTuKhoanMucTrongChungTu = i;
                            }
                        }
                    }
                    catch (Exception ex)
                    {
                    }

                    FrmProgressBar.StartShowProgress("Đang lưu");

                    if (_EditState == EditState.CreatingNew)
                        _ChungTu.InsertAndGhiSo();
                    else if (_EditState == EditState.Modifying)
                        _ChungTu.UpdateAndGhiSo();

                    SetEditState(EditState.Saved);

                    //FrmProgressBar.StartShowProgress("Đang tính lại tồn kho");
                    //_ChungTu.DanhSachChungTuPhuThuoc[0].TinhLaiTonKho();

                    return true;
                }
                catch (Exception ex)
                {
                    if (ex is CustomException && (ex as CustomException).ExceptionType == ExceptionType.SoChungTuDaCo)
                    {
                        ChungTu phieuXuatKho = _ChungTu.DanhSachChungTuPhuThuoc[0];

                        if (ex.Message.Contains(txtSo.Text))
                            txtSo.Text = CommonLib.TangSoChungTuTuDong(txtSo.Text, 1);
                        else if (ex.Message.Contains(phieuXuatKho.So))
                        {
                            if (_ChungTu.DanhSachChungTuPhuThuoc.Count >= 1)
                            {
                                phieuXuatKho.So = CommonLib.TangSoChungTuTuDong(phieuXuatKho.So, 1);
                            }
                        }
                        Save();
                    }
                    else
                        FrmExceptionNotifier.ShowAndLog(ex);
                    return false;
                }
            }
            catch (SqlException sqlEx)
            {
                throw new CustomException(CustomException.GetSqlExceptionMessage(sqlEx));
            }
            catch (Exception ex)
            {
                if (ex is CustomException) throw ex;
                else
                {
                    throw new Exception(ex.Message);
                }
            }
            finally
            {
                FrmProgressBar.FinishShowProgress();
            }
        }

        protected void PrintQuaCrystalReport()
        {
            try
            {
                if (_ChungTu != null && _ChungTu.ChungTuID != Guid.Empty)
                {
                    _ChungTu.PrintHĐBLQuaCrystalReport();
                }
            }
            catch (SqlException sqlEx)
            {
                throw new CustomException(CustomException.GetSqlExceptionMessage(sqlEx));
            }
            catch (Exception ex)
            {
                if (ex is CustomException) throw ex;
                else
                {
                    throw new Exception(ex.Message);
                }
            }
        }
        protected void PrintQuaCrystalReportA4()
        {
            try
            {
                if (_ChungTu != null && _ChungTu.ChungTuID != Guid.Empty)
                {
                    _ChungTu.PrintHĐBLQuaCrystalReportA4();
                }
            }
            catch (SqlException sqlEx)
            {
                throw new CustomException(CustomException.GetSqlExceptionMessage(sqlEx));
            }
            catch (Exception ex)
            {
                if (ex is CustomException) throw ex;
                else
                {
                    throw new Exception(ex.Message);
                }
            }
        }

        protected void Print()
        {
            try
            {
                int numVoucher = 0;
                numVoucher = (int)_ChungTu.SoTienNT / 200000;
                if (_ChungTu != null && _ChungTu.ChungTuID != Guid.Empty)
                {
                    //if (_PrintVoucher && numVoucher >= 1 && DateTime.Now < _DateExpiredVoucher)
                    //{
                    //    _ChungTu.PrintHoaDonBanLe(numVoucher);  //In có voucher
                    //    _PrintVoucher = false;
                    //}
                    //else
                    //    _ChungTu.PrintChungTu(); //in thường
                    _ChungTu.PrintChungTu(); //in thường
                }
            }
            catch (SqlException sqlEx)
            {
                throw new CustomException(CustomException.GetSqlExceptionMessage(sqlEx));
            }
            catch (Exception ex)
            {
                if (ex is CustomException) throw ex;
                else
                {
                    throw new Exception(ex.Message);
                }
            }
        }
        protected void PrintForeignLanguage(bool isQuaReport)
        {
            try
            {
                _ChungTu.PrintHĐBL_ForeignLanguge(isQuaReport);
            }
            catch (SqlException sqlEx)
            {
                throw new CustomException(CustomException.GetSqlExceptionMessage(sqlEx));
            }
            catch (Exception ex)
            {
                if (ex is CustomException) throw ex;
                else
                {
                    throw new Exception(ex.Message);
                }
            }
        }

        private void FillTongCong()
        {
            try
            {
                //Nếu cờ ngăn k được chạy FillTongCong bật thì bỏ qua.
                //Vì nếu chạy FillTongCong sớm khi thay đổi chiết khấu tổng ==> bị đệ quy lòng vòng. Tính lại CK hết mới FillTongCong
                if (_PreventFillTongCong) return;

                decimal tienVat = 0, thueSuat = 0;
                decimal tienHangChuaThue = 0;
                decimal tongTheoGiaBia = 0, tongSoTien = 0;
                decimal tongTienThueTheoKhoanMuc = 0;

                if (_GridDataSouce != null && _GridDataSouce.Rows.Count > 0)
                {
                    try
                    {
                        tongSoTien = _GridDataSouce.AsEnumerable().Sum(r => r.Field<decimal>("Value1") * r.Field<decimal>("Value6"));
                    }
                    catch (Exception ex)
                    {
                        tongSoTien = Convert.ToDecimal(_GridDataSouce.Compute("SUM(Value7)", "Value7 IS NOT NULL"));
                    }
                    try
                    {
                        tongTheoGiaBia = _GridDataSouce.AsEnumerable().Sum(r => r.Field<decimal>("Value1") * r.Field<decimal>("Value12"));
                    }
                    catch (Exception ex)
                    {
                        tongTheoGiaBia = Convert.ToDecimal(_GridDataSouce.Compute("SUM(Value13)", "Value13 IS NOT NULL"));
                    }

                    tienHangChuaThue = Convert.ToDecimal(_GridDataSouce.Compute("SUM(Value5)", "Value5 IS NOT NULL"));
                    tongTienThueTheoKhoanMuc = Convert.ToDecimal(_GridDataSouce.Compute("SUM(Value5)", "Value5 IS NOT NULL"));
                }

                if (cmbThueSuat.Enabled == false)  //những cửa hàng tính tự động độc lập
                {
                    tienVat = tongTienThueTheoKhoanMuc;
                }
                else if (cmbThueSuat.EditValue is Guid && (Guid)cmbThueSuat.EditValue != Guid.Empty)
                {
                    thueSuat = DanhMucThueSuat.Instance.GetByID((Guid)cmbThueSuat.EditValue).MucThueSuat;
                    if (thueSuat > 0) tienVat = tongSoTien * thueSuat;
                }

                txtTongGiaBia.EditValue = tongTheoGiaBia;
                txtTongSoTien.EditValue = tongSoTien;
                if (DanhMucStore.Instance.CurrentStore().Ten.ToUpper().Contains("THENAME"))
                {
                    if (txtSoTienKhachDua.Text.Trim() == "")
                        txtSoTienKhachDua.EditValue = tongSoTien;
                }
                txtTongSoLuong.EditValue = _ChungTu.DanhSachChungTuPhuThuoc[0].DanhSachKhoanMuc.DataTable.Compute("SUM (Value1)", "VatTuHangHoa1ID IS NOT NULL");
                if (Math.Round((decimal)txtTongChietKhau.EditValue, 0) != Math.Round(tongTheoGiaBia - tongSoTien, 0))
                    txtTongChietKhau.EditValue = tongTheoGiaBia - tongSoTien;
            }
            catch (Exception ex)
            {
                BasicForms.FrmExceptionNotifier.ShowAndLog(ex);
            }
        }
        protected bool CheckFullInfo()
        {
            //if (CheckExistedSoChungTuKhongKemSoMayInDB(txtSo.Text, _ChungTu.ChungTuID) &&
            //    (Config.CachSinhSoChungTu == CachSinhSoChungTu.TangTheoToanBoHeThong_CoSoMay ||
            //    Config.CachSinhSoChungTu == CachSinhSoChungTu.TangTheoToanBoHeThong_KhongCoSoMay))
            //    FrmEditRelativeChungTu_ResolveConflictSoChungTu(txtSo.Text, true, false);
            if (txtSo.Text == "")
            {
                txtSo.Focus();
                throw new CustomException("Hãy nhập số", ExceptionType.LackOfInputInfo);
                return false;
            }
            if (dateNgay.Text == "")
            {
                dateNgay.Focus();
                throw new CustomException("Hãy nhập ngày", ExceptionType.LackOfInputInfo);
                return false;
            }
            if (!(cmbDoiTuong.EditValue is Guid) || (Guid)cmbDoiTuong.EditValue == Guid.Empty)
            {
                cmbDoiTuong.Focus();
                throw new CustomException("Hãy chọn khách hàng", ExceptionType.LackOfInputInfo);
                return false;
            }
            if (!(cmbKho.EditValue is Guid) || (Guid)cmbKho.EditValue == Guid.Empty)
            {
                cmbKho.Focus();
                throw new CustomException("Hãy chọn kho xuất hàng", ExceptionType.LackOfInputInfo);
                return false;
            }
            if (cmbThueSuat.Enabled)
            {
                if (cmbThueSuat.EditValue == null || (Guid)cmbThueSuat.EditValue == Guid.Empty)
                {
                    cmbThueSuat.Focus();
                    throw new CustomException("Hãy chọn thuế suất", ExceptionType.LackOfInputInfo);
                }
            }
            else
                cmbThueSuat.EditValue = DanhMucThueSuat.Instance.GetByProperty("Ma", "V00").ID;

            if (_ChungTu.DanhSachChungTuPhuThuoc[0].DanhSachKhoanMuc.Count == 0 || (decimal)txtTongSoLuong.EditValue == 0)
            {
                cmbMaHang.Focus();
                throw new CustomException("Hãy chọn mặt hàng cho hóa đơn", ExceptionType.LackOfInputInfo);
                return false;
            }
            return true;
        }
        protected bool CheckXuatHangAm()
        {
            if (!(cmbKho.EditValue is Guid) || (Guid)cmbKho.EditValue == Guid.Empty)
            {
                throw new CustomException("Phải chọn kho trước khi bán hàng.");
            }
            if (Config.DuocPhepXuatHangAm != DuocPhepXuatHangAmHayKhong.KhongDuocPhep) return true;

            SqlConnection con = new SqlConnection(GeneralLibs.LocalSettings.ConnectString);
            try
            {
                con.Open();
                SqlCommand cmd = con.CreateCommand();

                ChungTu phieuXuat = _ChungTu.DanhSachChungTuPhuThuoc[0];
                ThoiDiemKhoaSo thoiDiemKhoaSoGanNhat = DanhMucThoiDiemKhoaSo.Instance.GetThoiDiemChotSoDuGanNhat(dateNgay.DateTime);
                foreach (KhoanMucChungTu khoanMuc in phieuXuat.DanhSachKhoanMuc)
                {
                    TonKho tonTaiKhoNay = TonKho.CalculateTonTuThoiDiemKhoaSoGanNhatDenThoiDiemNhapVaoTheoKho(cmd, dateNgay.DateTime.AddSeconds(-1), (Guid)cmbKho.EditValue, khoanMuc.VatTuHangHoa1ID);
                    if (tonTaiKhoNay.SoLuong < khoanMuc.Value1)
                        throw new CustomException(string.Format("Không đủ hàng {0} để xuất", DanhMucVatTuHangHoa.Instance.GetByID(khoanMuc.VatTuHangHoa1ID).Ten), ExceptionType.XuatHangAm);
                }
            }
            catch (SqlException sqlEx)
            {
                throw new CustomException(CustomException.GetSqlExceptionMessage(sqlEx));
            }
            catch (Exception ex)
            {
                if (ex is CustomException) throw ex;
                else
                {
                    throw new Exception(ex.Message);
                }
            }
            finally
            {
                con.Close();
            }
            return true;
        }

        private void btnSave_Click(object sender, EventArgs e)
        {
            try
            {
                Save();
            }
            catch (Exception ex)
            {
                BasicForms.FrmExceptionNotifier.ShowAndLog(ex);
            }
        }
        private void btnSaveAndPrint_Click(object sender, EventArgs e)
        {
            try
            {
                SaveAndPrint();
            }
            catch (Exception ex)
            {
                BasicForms.FrmExceptionNotifier.ShowAndLog(ex);
            }
        }
        private void btnPrint_Click(object sender, EventArgs e)
        {
            try
            {
                if (DanhMucStore.Instance.CurrentStore().Ten.ToUpper().Contains("TTSHN"))
                    PrintQuaCrystalReportA4();
                else
                    PrintQuaCrystalReport();
            }
            catch (Exception ex)
            {
                BasicForms.FrmExceptionNotifier.ShowAndLog(ex);
            }
        }
        private void btnSavePrintForeign_Click(object sender, EventArgs e)
        {
            try
            {
                SaveAndPrintForeignLanguage();
            }
            catch (Exception ex)
            {
                BasicForms.FrmExceptionNotifier.ShowAndLog(ex);
            }
        }
        private void btnCreateNew_Click(object sender, EventArgs e)
        {
            try
            {
                Reset();
            }
            catch (Exception ex)
            {
                BasicForms.FrmExceptionNotifier.ShowAndLog(ex);
            }
        }
        private void btnClose_Click(object sender, EventArgs e)
        {
            this.Close();
        }
        private void btnEdit_Click(object sender, EventArgs e)
        {
            try
            {
                Edit();
            }
            catch (Exception ex)
            {
                BasicForms.FrmExceptionNotifier.ShowAndLog(ex);
            }
        }
        private void FrmEditHoaDonBanLe_FormClosing(object sender, FormClosingEventArgs e)
        {
            try
            {
                string maLoaiChungTu = "";
                try
                {
                    maLoaiChungTu = DanhMucLoaiChungTu.Instance.GetByID(_ChungTu.LoaiChungTuID).Ma;// form đóng thì _ChungTu.LoaiChungTuID đã được set rồi
                }
                catch (Exception)
                {
                    //K lấy được thì k cần xử lý nữa, vì sẽ báo lỗi null
                    return;
                }
                int countKhoanMuc = 0;
                if (customGridKhoanMuc.DataSource is DataTable) countKhoanMuc = (customGridKhoanMuc.DataSource as DataTable).Rows.Count;

                bool allowReset = true;

                //Check xóa hàng quét thẻ
                if ((_EditState == EditState.Modifying || _EditState == EditState.CreatingNew) && countKhoanMuc > 0)
                {
                    if (Config.MoXoaHangCanQuetThe == DuocPhepMoXoaHangCanQuetThe.DuocPhep)
                    {
                        if (CustomSecurity.User.CurUser.RoleList.Contains("Admin") || CustomSecurity.User.CurUser.UserName == "SupAdmin")
                        {
                            allowReset = true;
                        }
                        else
                        {
                            FrmVerifiedPassword frm = new FrmVerifiedPassword();
                            if (frm.ShowDialog() == DialogResult.OK)
                                allowReset = true;
                            else
                                allowReset = false;
                        }
                    }
                    else  //Nếu các store khác thì không cần
                    {
                        allowReset = true;
                    }
                }

                //Nếu không pass quét thẻ thì không cho close
                if (!allowReset)
                {
                    e.Cancel = true;
                }

                if (_ChungTu.ChungTuID != Guid.Empty)
                {
                    if (_EditState != EditState.SavedInLedger && _EditState != EditState.Saved && _EditState != EditState.SavedButNotInLedger
                        && maLoaiChungTu != "PhieuDatHang" && maLoaiChungTu != "PhieuKiemKe" && countKhoanMuc > 0)
                    {
                        if (MessageBox.Show("Chứng từ này chưa ghi sổ. Bạn có muốn ghi sổ không?", "Cảnh báo", MessageBoxButtons.YesNo) == DialogResult.Yes)
                        {
                            Save();
                        }
                    }
                }

                DataTable dt = (customGridKhoanMuc.DataSource as DataTable);
                if (Config.KiemTraHoaDonBanLeKhongLuu == KiemTraHoaDonBanLeKhongLuu.DuocPhep && !_ChungTu.GhiSo &&
                    countKhoanMuc > 0)
                {
                    string listHangHoa = "";
                    foreach (DataRow khoanMuc in dt.Rows)
                    {
                        VatTuHangHoa vthh = DanhMucVatTuHangHoa.Instance.GetByID((Guid)khoanMuc["VatTuHangHoa1ID"]);
                        if (vthh != null)
                        {
                            listHangHoa += vthh.Ten + " | ";
                        }
                    }

                    NhatKySuDung.Insert2DB("Xóa ", string.Format("HĐBL: {0}, Thành tiền = {1} VNĐ (Gồm: {2}) mà không lưu",
                        txtSo.Text.Trim(), txtTongSoTien.Text.Trim(), listHangHoa));
                }
            }
            catch (Exception ex)
            {
                e.Cancel = true;
                BasicForms.FrmExceptionNotifier.ShowAndLog(ex);
            }
        }

        void DataTable_RowDeleted(object sender, DataRowChangeEventArgs e)
        {
            try
            {
                FillTongCong();
            }
            catch (Exception ex)
            {
                BasicForms.FrmExceptionNotifier.ShowAndLog(ex);
            }
        }
        void DataTable_RowChanged(object sender, DataRowChangeEventArgs e)
        {
            try
            {
                //Hi hữu cả năm có 2-3 hàng lại không tự điền giá bìa --> check kỹ lại
                try
                {
                    DataRow row = e.Row;
                    if (row["VatTuHangHoa1ID"] is Guid && !(row["Value12"] is decimal))
                        row["Value12"] = DanhMucVatTuHangHoa.Instance.GetByID((Guid)row["VatTuHangHoa1ID"]).GiaBia;
                }
                catch (Exception ex)
                { }
                //Kiểm tra không được để kho trống khi nhập hàng
                if (!(cmbKho.EditValue is Guid) || (Guid)cmbKho.EditValue == Guid.Empty)
                {
                    if (_DetectedHangTonAm != null)
                    {
                        if (customGridKhoanMuc.DataSource is DataTable) (customGridKhoanMuc.DataSource as DataTable).Rows.Remove(_DetectedHangTonAm);
                        _DetectedHangTonAm = null;
                    }
                }
                //Kiểm tra xuất hàng âm
                if (Config.DuocPhepXuatHangAm == DuocPhepXuatHangAmHayKhong.KhongDuocPhep)
                {
                    if (_DetectedHangTonAm != null)
                    {
                        try
                        {
                            if (customGridKhoanMuc.DataSource is DataTable) (customGridKhoanMuc.DataSource as DataTable).Rows.Remove(_DetectedHangTonAm);
                            _DetectedHangTonAm = null;
                        }
                        catch (Exception ex)
                        {
                        }
                    }
                }
                FillTongCong();
            }
            catch (Exception ex)
            {
                BasicForms.FrmExceptionNotifier.ShowAndLog(ex);
            }
        }
        void DataTable_ColumnChanged(object sender, DataColumnChangeEventArgs e)
        {
            try
            {
                DataRow row = e.Row;
                switch (e.Column.Caption)
                {
                    case "VatTuHangHoa1ID":

                        if (row != null && row["VatTuHangHoa1ID"] is Guid)
                        {
                            #region Chưa chọn kho thì chưa cho nhập hàng
                            try
                            {
                                if (!(cmbKho.EditValue is Guid) || (Guid)cmbKho.EditValue == Guid.Empty)
                                {
                                    FrmWarning.Show("Thông báo", "Chưa chọn kho.");
                                    _DetectedHangTonAm = row;
                                    SendKeys.Send("{DOWN}");
                                    return;
                                }
                            }
                            catch (Exception ex)
                            {
                            }
                            #endregion

                            #region Xem là hàng âm thì k cho nhập
                            try
                            {
                                if (Config.DuocPhepXuatHangAm == DuocPhepXuatHangAmHayKhong.KhongDuocPhep)
                                {
                                    TonKho tonToanBo = null;
                                    TonKho tonTaiKhoNay = null;
                                    TinhToanTon((Guid)cmbKho.EditValue, (Guid)row["VatTuHangHoa1ID"], ref tonTaiKhoNay, ref tonToanBo);
                                    if ((int)tonTaiKhoNay.SoLuong <= 0) //nếu xuất âm
                                    {
                                        _AllowShowMessageXuatHangAm = false; //Đã hiện Message khi check tại row["VatTuHangHoa1ID"] (bao giờ cũng được check trước) thì không hiện ở row["Value1"].
                                        MessageBox.Show(string.Format("Không đủ hàng {0} để xuất", DanhMucVatTuHangHoa.Instance.GetByID((Guid)row["VatTuHangHoa1ID"]).Ten));
                                        _DetectedHangTonAm = row;   //Lưu lại hàng này và lên DataTable_RowChanged kiểm tra xóa đi nếu cần
                                        SendKeys.Send("{DOWN}");    //Ấn xuống để nhận dòng này là 1 row, lúc này sẽ kích hoạt DataTable_RowChanged.
                                        return;
                                    }
                                }
                            }
                            catch (Exception ex)
                            {
                            }
                            #endregion

                            VatTuHangHoa vatTuHangHoa = DanhMucVatTuHangHoa.Instance.GetByID((Guid)row["VatTuHangHoa1ID"]);

                            if (!(row["Value1"] is decimal)) row["Value1"] = 1;//sẽ gọi TinhGiaVonLaiTungDong() ở case "Value1":
                            else TinhGiaVonLaiTungDong(row);
                            //Điền sớm luôn để phòng k tính được giá thanh toán
                            row["Value6"] = vatTuHangHoa.GiaBia;

                            DoiTuongNghiepVu doiTuongNghiepVu = null;
                            if (cmbDoiTuong.EditValue is Guid && (Guid)cmbDoiTuong.EditValue != Guid.Empty)
                            {
                                doiTuongNghiepVu = DanhMucDoiTuongNghiepVu.Instance.GetByID((Guid)cmbDoiTuong.EditValue);
                            }

                            //Nếu sửa hoặc thêm mới thì tính toán để nhập CK và Giá bán lẻ lấy từ danh mục
                            DoiTuongKhuyenMai doiTuongKhuyenMai = null;
                            if (_ActiveChuongTrinhKhuyenMai != null && cmbDoiTuong.EditValue is Guid) doiTuongKhuyenMai = DanhMucDoiTuongKhuyenMai.Instance.GetByIDs(_ActiveChuongTrinhKhuyenMai.ID, (Guid)cmbDoiTuong.EditValue);

                            if (doiTuongKhuyenMai != null)
                            {
                                if (_ActiveChuongTrinhKhuyenMai != null && _ActiveChuongTrinhKhuyenMai.KieuKhuyenMai == (int)KieuKhuyenMai.TheoThoiGian)
                                {
                                    #region Có chương trình khuyến mại theo thời gian

                                    ChiTietKhuyenMaiTheoThoiGian chiTietKhuyenMaiTheoThoiGian = DanhMucChiTietKhuyenMaiTheoThoiGian.Instance.GetByKey(_ActiveChuongTrinhKhuyenMai.ID, vatTuHangHoa.ID);
                                    if (chiTietKhuyenMaiTheoThoiGian != null)
                                    {
                                        row["Value8"] = chiTietKhuyenMaiTheoThoiGian.ChietKhauKhuyenMai;
                                        row["ChuongTrinhKhuyenMaiID"] = _ActiveChuongTrinhKhuyenMai.ID;
                                    }
                                    else row["Value8"] = vatTuHangHoa.ChietKhauBanLe;

                                    #endregion
                                }
                                else if (_ActiveChuongTrinhKhuyenMai != null && _ActiveChuongTrinhKhuyenMai.KieuKhuyenMai == (int)KieuKhuyenMai.TheoTongTienTichLuy)
                                {
                                    #region Có chương trình khuyến mại theo Tổng tiền tích lũy

                                    if (cmbDoiTuong.EditValue is Guid)   //Tính tổng số tiền mua hàng tích lũy
                                    {
                                        if (doiTuongKhuyenMai != null)
                                        {
                                            decimal chietKhauKhuyenMai = 0;
                                            decimal tongSoTien = 0;

                                            tongSoTien = (decimal)DanhMucChiTietKhuyenMaiTheoTongTienTichLuy.Instance.CalculateTongTienTichLuyTheoKhachHang((Guid)cmbDoiTuong.EditValue, _ActiveChuongTrinhKhuyenMai.NgayBatDauTinhTongTien, _ActiveChuongTrinhKhuyenMai.NgayKetThucTinhTongTien);

                                            foreach (ChiTietKhuyenMaiTheoTongTienTichLuy chiTietKhuyenMaiTheoTongTienTichLuy in DanhMucChiTietKhuyenMaiTheoTongTienTichLuy.Filter(string.Format("ChuongTrinhKhuyenMaiID = '{0}'", _ActiveChuongTrinhKhuyenMai.ID)))
                                            {
                                                if (chiTietKhuyenMaiTheoTongTienTichLuy.TongTienTu <= tongSoTien && tongSoTien < chiTietKhuyenMaiTheoTongTienTichLuy.TongTienDen)
                                                {
                                                    if (chiTietKhuyenMaiTheoTongTienTichLuy != null) chietKhauKhuyenMai = chiTietKhuyenMaiTheoTongTienTichLuy.ChietKhauKhuyenMai;
                                                    break;
                                                }
                                            }
                                            //Nếu k nằm trong khoảng tổng tiền nào thì CK = 0
                                            if (chietKhauKhuyenMai >= 0)
                                            {
                                                row["Value8"] = chietKhauKhuyenMai;
                                                row["ChuongTrinhKhuyenMaiID"] = _ActiveChuongTrinhKhuyenMai.ID;
                                            }
                                            else row["Value8"] = (decimal)0;
                                        }
                                        else row["Value8"] = (decimal)0;
                                    }

                                    #endregion
                                }
                                else if (doiTuongNghiepVu != null && doiTuongNghiepVu.ChietKhauTheVIP > 0)
                                {
                                    row["Value8"] = doiTuongNghiepVu.ChietKhauTheVIP;
                                }
                                else
                                {
                                    row["Value8"] = vatTuHangHoa.ChietKhauBanLe;
                                }
                            }
                            else if (doiTuongNghiepVu != null && doiTuongNghiepVu.ChietKhauTheVIP > 0)
                            {
                                row["Value8"] = doiTuongNghiepVu.ChietKhauTheVIP;
                            }
                            else
                            {
                                row["Value8"] = vatTuHangHoa.ChietKhauBanLe;
                            }
                            row["Value12"] = vatTuHangHoa.GiaBia;
                            row["Value2"] = vatTuHangHoa.GiaBia;
                        }
                        break;
                    case "Value1"://SoLuong
                        if (row["Value1"] is decimal)
                        {
                            //Tính toán check xuất âm
                            TonKho tonTaiKhoNay = TonKho.CalculateTonTuThoiDiemKhoaSoGanNhatDenThoiDiemNhapVaoTheoKho(dateNgay.DateTime.AddSeconds(-1), (Guid)cmbKho.EditValue, (Guid)row["VatTuHangHoa1ID"]);
                            if (tonTaiKhoNay.SoLuong < (decimal)row["Value1"] && Config.DuocPhepXuatHangAm == DuocPhepXuatHangAmHayKhong.KhongDuocPhep)  //Nếu xuất âm
                            {
                                if (_AllowShowMessageXuatHangAm)    //nếu được show thông báo mới show.
                                {
                                    MessageBox.Show(string.Format("Không đủ hàng {0} để xuất", DanhMucVatTuHangHoa.Instance.GetByID((Guid)row["VatTuHangHoa1ID"]).Ten));
                                }
                                _AllowShowMessageXuatHangAm = true;  //cứ chạy qua đây phải bật lại là true, ví đây là check sau row["VatTuHangHoa1ID"]
                                _AllowSave = false; //Bật cờ không được lưu lên

                                //Nếu value12 và 13 đã có số liệu rồi thì dựa vào đó RollBack lại số lượng cũ
                                if (row["Value12"] is decimal && row["Value13"] is decimal && (decimal)row["Value1"] != ((decimal)row["Value13"] / (decimal)row["Value12"]))
                                {
                                    row["Value1"] = (decimal)row["Value13"] / (decimal)row["Value12"];
                                }
                                else //Nếu value12 và 13 chưa có thì điền value1 == null để tránh bị lặp vòng tròn. 
                                {
                                    row["Value1"] = System.DBNull.Value;       //Nếu để có giá trị là bị lặp vô hạn
                                }
                            }
                            else //Nếu không xuất âm thì tính toán bình thường
                            {
                                _AllowSave = true; //Bật cờ được lưu 
                                TinhGiaVonLaiTungDong(row);
                                if (row["Value2"] is decimal) row["Value3"] = (decimal)row["Value1"] * (decimal)row["Value2"];
                                if (row["Value4"] is decimal) row["Value5"] = (decimal)row["Value1"] * (decimal)row["Value4"];
                                if (row["Value6"] is decimal) row["Value7"] = (decimal)row["Value1"] * (decimal)row["Value6"];
                                if (row["Value12"] is decimal) row["Value13"] = (decimal)row["Value1"] * (decimal)row["Value12"];
                            }
                        }
                        break;
                    case "Value2":
                        if (row["Value1"] is decimal && (decimal)row["Value2"] > 0)
                        {
                            if (!(row["Value3"] is decimal) || (decimal)row["Value3"] != (decimal)row["Value1"] * (decimal)row["Value2"])
                                row["Value3"] = (decimal)row["Value1"] * (decimal)row["Value2"];
                        }
                        break;
                    case "Value3"://Tien nhap kho NT
                        //TienXKQD
                        if (row["Value1"] is decimal && (decimal)row["Value1"] > 0)
                        {
                            if (!(row["Value2"] is decimal) || (decimal)row["Value2"] != (decimal)row["Value3"] / (decimal)row["Value1"])
                                row["Value2"] = (decimal)row["Value3"] / (decimal)row["Value1"];
                        }
                        break;
                    case "Value4"://Tiền thuế
                        if (cmbThueSuat.Enabled == false)  //những cửa hàng tính tự động độc lập
                        {
                            decimal thueSuatXuat = 0;

                            ////Thuế suất tính theo nhập trước xuất trước. Nhưng khóa sổ lại bị sai
                            //VatTuHangHoa.CalculateThueXuatKho((Guid)row["VatTuHangHoa1ID"], (Guid)cmbKho.EditValue, dateNgay.DateTime, (decimal)row["Value1"]);

                            //Tính theo thuế đầu vào. 1 hàng có thuế đầu vào là X thì luôn luôn là X
                            VatTuHangHoa.CalculateThueNhapKhoByHangHoa((Guid)row["VatTuHangHoa1ID"], (Guid)cmbKho.EditValue);
                            if ((Guid)cmbThueSuat.EditValue != Guid.Empty)
                            {
                                if (!(row["Value6"] is decimal) || (decimal)row["Value6"] != (decimal)row["Value4"] / (1 - thueSuatXuat))
                                {
                                    row["Value6"] = (decimal)row["Value4"] * (1 + thueSuatXuat);
                                }
                            }
                        }
                        else //Tính bình thường
                        {
                            if ((Guid)cmbThueSuat.EditValue != Guid.Empty)
                            {
                                Guid thueSuatID = (Guid)cmbThueSuat.EditValue;
                                if (!(row["Value6"] is decimal) || (decimal)row["Value6"] != (decimal)row["Value4"] / (1 - DanhMucThueSuat.Instance.GetByID(thueSuatID).MucThueSuat))
                                {
                                    row["Value6"] = (decimal)row["Value4"] * (1 + DanhMucThueSuat.Instance.GetByID(thueSuatID).MucThueSuat);
                                }
                            }
                        }
                        if (row["Value1"] is decimal && row["Value4"] is decimal)
                        {
                            row["Value5"] = (decimal)row["Value1"] * (decimal)row["Value4"];
                        }
                        break;
                    case "Value6"://DonGiaNT
                        if (cmbThueSuat.Enabled == false)  //những cửa hàng tính tự động độc lập
                        {
                            decimal thueSuatXuat = 0;

                            ////Thuế suất tính theo nhập trước xuất trước. Nhưng khóa sổ lại bị sai
                            //VatTuHangHoa.CalculateThueXuatKho((Guid)row["VatTuHangHoa1ID"], (Guid)cmbKho.EditValue, dateNgay.DateTime, (decimal)row["Value1"]);

                            //Tính theo thuế đầu vào. 1 hàng có thuế đầu vào là X thì luôn luôn là X
                            VatTuHangHoa.CalculateThueNhapKhoByHangHoa((Guid)row["VatTuHangHoa1ID"], (Guid)cmbKho.EditValue);
                            if (!(row["Value4"] is decimal) || (decimal)row["Value4"] != (decimal)row["Value6"] - ((decimal)row["Value6"] * thueSuatXuat))
                            {
                                row["Value4"] = (decimal)row["Value6"] / (1 + thueSuatXuat);
                            }
                        }
                        else //Tính bình thường
                        {
                            if ((Guid)cmbThueSuat.EditValue != Guid.Empty)
                            {
                                Guid thueSuatID = (Guid)cmbThueSuat.EditValue;
                                ThueSuat thueSuat = DanhMucThueSuat.Instance.GetByID(thueSuatID);
                                if (thueSuat != null)
                                    if (!(row["Value4"] is decimal) || (decimal)row["Value4"] != (decimal)row["Value6"] - ((decimal)row["Value6"] * DanhMucThueSuat.Instance.GetByID(thueSuatID).MucThueSuat))
                                    {
                                        row["Value4"] = (decimal)row["Value6"] / (1 + DanhMucThueSuat.Instance.GetByID(thueSuatID).MucThueSuat);
                                    }
                            }
                            else
                            {
                                row["Value4"] = (decimal)row["Value6"];
                            }
                        }
                        try
                        {
                            if (!(row["Value12"] is decimal) || !(row["Value6"] is decimal) || (decimal)row["Value8"] != 100 - (((decimal)row["Value6"] * 100) / (decimal)row["Value12"]))
                            {
                                decimal a = (decimal)row["Value6"];
                                decimal b = (decimal)row["Value12"];
                                row["Value8"] = 100 - (((decimal)row["Value6"] * 100) / (decimal)row["Value12"]);
                            }
                        }
                        catch (Exception ex)
                        {
                        }

                        if (row["Value1"] is decimal && row["Value6"] is decimal)
                        {
                            row["Value7"] = (decimal)row["Value1"] * (decimal)row["Value6"];
                            FillTongCong();
                        }
                        break;
                    case "Value7":
                        if (row["Value7"] != DBNull.Value && row["Value1"] != DBNull.Value)
                        {
                            if (row["Value6"] != DBNull.Value)
                            {
                                if ((decimal)e.Row["Value6"] != ((decimal)e.Row["Value7"] / (decimal)e.Row["Value1"]))
                                    e.Row["Value6"] = (decimal)e.Row["Value7"] / (decimal)e.Row["Value1"];
                            }
                            else
                            {
                                e.Row["Value6"] = (decimal)e.Row["Value7"] / (decimal)e.Row["Value1"];
                            }
                        }
                        break;
                    case "Value8":
                        if (row["Value12"] != DBNull.Value && row["Value8"] != DBNull.Value)
                        {
                            //row["Value6"] = Math.Round((decimal)row["Value12"] * (100 - (decimal)row["Value8"]) / 100);
                            row["Value6"] = Math.Round((decimal)row["Value12"] * (100 - (decimal)row["Value8"]) / 100, 2);
                        }
                        break;
                    case "Value12":
                        if (row["Value12"] != DBNull.Value && row["Value8"] != DBNull.Value)
                        {
                            //row["Value6"] = Math.Round((decimal)row["Value12"] * (100 - (decimal)row["Value8"]) / 100);
                            row["Value6"] = Math.Round((decimal)row["Value12"] * (100 - (decimal)row["Value8"]) / 100, 2);
                        }
                        if (row["Value12"] != DBNull.Value && row["Value1"] != DBNull.Value)
                        {
                            e.Row["Value13"] = (decimal)e.Row["Value1"] * (decimal)e.Row["Value12"];
                        }
                        break;

                }
            }
            catch (Exception ex)
            {
                BasicForms.FrmExceptionNotifier.ShowAndLog(ex);
            }
        }

        private void TinhGiaVonLaiTungDong(DataRow row)
        {
            ThoiDiemKhoaSo thoiDiemKhoaSoGanNhat = DanhMucThoiDiemKhoaSo.Instance.GetThoiDiemChotSoDuGanNhat(dateNgay.DateTime);
            List<decimal> lst = new List<decimal>();

            if (row["VatTuHangHoa1ID"] is Guid && row["Value1"] is decimal && cmbKho.EditValue is Guid)
            {
                Guid currentVatTuHangHoaID = (Guid)row["VatTuHangHoa1ID"];

                if (Config.PhuongPhapTinhGiaTonKho == PhuongPhapTinhGiaTonKho.FIFO)
                {
                    row["Value2"] = VatTuHangHoa.CalculateGiaXuatKho((Guid)row["VatTuHangHoa1ID"], (Guid)cmbKho.EditValue, dateNgay.DateTime, (decimal)row["Value1"]);
                }
                else
                {
                    if (Config.PhuongPhapTinhGiaTonKho == PhuongPhapTinhGiaTonKho.BinhQuanGiaNhap)
                    {
                        lst = DanhMucVatTuHangHoa.Instance.GetGiaVonNhapTrungBinhToanBoCacKhoIncludeMaxMin(currentVatTuHangHoaID,
                            thoiDiemKhoaSoGanNhat.ID, thoiDiemKhoaSoGanNhat.ThoiDiem, dateNgay.DateTime);
                    }
                    else
                    {
                        lst = DanhMucVatTuHangHoa.Instance.GetGiaVonMuaTrungBinhToanBoCacKhoIncludeMaxMin(currentVatTuHangHoaID,
                            thoiDiemKhoaSoGanNhat.ID, thoiDiemKhoaSoGanNhat.ThoiDiem, dateNgay.DateTime);

                        if (lst[0] <= 0)
                            lst = DanhMucVatTuHangHoa.Instance.GetGiaVonNhapTrungBinhToanBoCacKhoIncludeMaxMin(currentVatTuHangHoaID,
                            thoiDiemKhoaSoGanNhat.ID, thoiDiemKhoaSoGanNhat.ThoiDiem, dateNgay.DateTime);
                    }

                    row["Value2"] = lst[0];
                }
            }
        }
        private void TinhToanTon(Guid khoID, Guid vatTuHangHoaID, ref TonKho tonTaiKhoNay, ref TonKho tonToanBo)
        {
            SqlConnection con = new SqlConnection(GeneralLibs.LocalSettings.ConnectString);
            try
            {
                if (khoID != Guid.Empty && vatTuHangHoaID != Guid.Empty)
                {
                    con.Open();
                    SqlCommand cmd = con.CreateCommand();
                    VatTuHangHoa vthh = DanhMucVatTuHangHoa.Instance.GetByID(vatTuHangHoaID);
                    tonTaiKhoNay = TonKho.CalculateTonTuThoiDiemKhoaSoGanNhatDenThoiDiemNhapVaoTheoKho(cmd, dateNgay.DateTime, khoID, vatTuHangHoaID);
                    tonToanBo = TonKho.CalculateTongTonTuThoiDiemKhoaSoGanNhatDenThoiDiemNhapVao(cmd, dateNgay.DateTime, vatTuHangHoaID);
                    TonKho tongNhap = TonKho.CalculateTongMuaTheoThoiDiemKhoaSoGanNhat(cmd, dateNgay.DateTime, vatTuHangHoaID);
                    TonKho tongXuat = TonKho.CalculateTongBanTheoThoiDiemKhoaSoGanNhat(cmd, dateNgay.DateTime, vatTuHangHoaID);
                }
            }
            catch (SqlException sqlEx)
            {
                throw new CustomException(CustomException.GetSqlExceptionMessage(sqlEx));
            }
            catch (Exception ex)
            {
                if (ex is CustomException) throw ex;
                else
                {
                    throw new Exception(ex.Message);
                }
            }
            finally
            {
                con.Close();
            }
        }

        private void txtTongSoTien_EditValueChanged(object sender, EventArgs e)
        {
            try
            {
                if (txtSoTienKhachDua.EditValue is decimal && txtTongSoTien.EditValue is decimal)
                {
                    if ((decimal)txtSoTienKhachDua.EditValue >= (decimal)txtTongSoTien.EditValue)
                    {
                        lblTienThua.Text = "Tiền thừa";
                        txtSoTienTraLai.EditValue = (decimal)txtSoTienKhachDua.EditValue - (decimal)txtTongSoTien.EditValue;
                    }
                    else
                    {
                        lblTienThua.Text = "Tiền thiếu ";
                        txtSoTienTraLai.EditValue = (decimal)txtTongSoTien.EditValue - (decimal)txtSoTienKhachDua.EditValue;
                    }
                }
            }
            catch (Exception ex)
            {
                BasicForms.FrmExceptionNotifier.ShowAndLog(ex);
            }
        }
        private void txtSoTienKhachDua_EditValueChanged(object sender, EventArgs e)
        {
            try
            {
                if (txtSoTienKhachDua.EditValue is decimal && txtTongSoTien.EditValue is decimal)
                {
                    if ((decimal)txtSoTienKhachDua.EditValue >= (decimal)txtTongSoTien.EditValue)
                    {
                        lblTienThua.Text = "Tiền thừa";
                        txtSoTienTraLai.EditValue = (decimal)txtSoTienKhachDua.EditValue - (decimal)txtTongSoTien.EditValue;
                        txtSoTienTraLai.BackColor = Color.SkyBlue;
                    }
                    else
                    {
                        lblTienThua.Text = "Tiền thiếu ";
                        txtSoTienTraLai.EditValue = (decimal)txtTongSoTien.EditValue - (decimal)txtSoTienKhachDua.EditValue;
                        txtSoTienTraLai.BackColor = Color.LightSalmon;
                    }
                }
            }
            catch (Exception ex)
            {
                BasicForms.FrmExceptionNotifier.ShowAndLog(ex);
            }
        }

        private void btnThongKe_Click(object sender, EventArgs e)
        {
            try
            {
                BanLe.ThongKeBanHangLe.FrmThongKeBanLeVB frm = new BanLe.ThongKeBanHangLe.FrmThongKeBanLeVB();
                frm.Show();
            }
            catch (Exception ex)
            {
                BasicForms.FrmExceptionNotifier.ShowAndLog(ex);
            }
        }
        private void cmbDoiTuong_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar == 13)
            {
                SendKeys.Send("{TAB}");
            }
        }
        private void cmbKho_EditValueChanged(object sender, EventArgs e)
        {
            try
            {
                if (cmbKho.EditValue is Guid && (Guid)cmbKho.EditValue != Guid.Empty && (Guid)cmbKho.EditValue != GeneralLibs.LocalSettings.HeThong.KhoID)
                {
                    GeneralLibs.LocalSettings.HeThong.KhoID = (Guid)cmbKho.EditValue;
                    GeneralLibs.LocalSettings.HeThong.Save2File();
                }
                if (cmbKho.Text == "" && cmbKho.EditValue == null) cmbKho.EditValue = Guid.Empty;

                Kho khoXuat = DanhMucKho.Instance.GetByID((Guid)cmbKho.EditValue);
                Store store = DanhMucStore.Instance.GetByStoreID(Config.StoreID);

                if (store.Ten.ToUpper().Contains("VIETBOOK"))  // Nếu không là cty sách HN VietBook thì chỉ hiển thị thông báo
                {
                    if (khoXuat != null)
                        txtSo.Text = this.GenerateSoChungTuFromConfigInCauHinhKhac(DanhMucLoaiChungTu.Instance.GetByMa("HoaDonBanLe").ID, khoXuat.Ma + "BL", 7, true);
                    else
                        txtSo.Text = this.GenerateSoChungTuFromConfigInCauHinhKhac(DanhMucLoaiChungTu.Instance.GetByMa("HoaDonBanLe").ID, true);
                }
                else
                    txtSo.Text = this.GenerateSoChungTuFromConfigInCauHinhKhac(DanhMucLoaiChungTu.Instance.GetByMa("HoaDonBanLe").ID, true);
            }
            catch (Exception ex)
            {
                BasicForms.FrmExceptionNotifier.ShowAndLog(ex);
            }
        }

        private void TruSoLuongBangPhimTat()
        {
            VatTuHangHoa selected = DanhMucVatTuHangHoa.GetByMaInHangHoaDangSuDung(cmbMaHang.Text);
            if (selected != null)
            {
                foreach (KhoanMucChungTu existed in _ChungTu.DanhSachChungTuPhuThuoc[0].DanhSachKhoanMuc)
                {
                    if (existed.VatTuHangHoa1ID == selected.ID)
                    {
                        if (existed.Value1 > 1) //Nếu hàng đó có số lượng lớn hơn 1 thì mới trừ
                        {
                            existed.Value1--;
                            if (lblThongTinTonKho.Text.Contains("SL"))
                                lblThongTinTonKho.Text = lblThongTinTonKho.Text.Replace("SL+", "SL-");
                            else if (!lblThongTinTonKho.Text.Contains("SL-"))
                                lblThongTinTonKho.Text = string.Format("SL- | {0}", lblThongTinTonKho.Text);
                        }
                        return; //Xong rồi thì không cần xem hàng khác nữa. Vì Grid không được có 2 hàng giống nhau
                    }
                }
            }
        }
        private void cmbMaHang_KeyPress(object sender, KeyPressEventArgs e)
        {
            try
            {
                if (_EditState == EditState.CreatingNew || _EditState == EditState.Modifying)
                {

                    if (!(cmbKho.EditValue is Guid) || (Guid)cmbKho.EditValue == Guid.Empty)
                    {
                        FrmWarning.Show("Thông báo", "Chưa chọn kho.");
                        return;
                    }
                    if (cmbThueSuat.EditValue == null || (Guid)cmbThueSuat.EditValue == Guid.Empty)
                    {
                        FrmWarning.Show("Thông báo", "Chưa chọn thuế suất");
                        cmbThueSuat.Focus();
                        return;
                    }
                    if (e.KeyChar == 13)
                    {
                        VatTuHangHoa selected = DanhMucVatTuHangHoa.GetByMaInHangHoaDangSuDung(cmbMaHang.Text);
                        if (selected != null && _ChungTu != null)
                        {
                            DataRow[] existedRows = _ChungTu.DanhSachChungTuPhuThuoc[0].DanhSachKhoanMuc.DataTable.Select("VatTuHangHoa1ID = '" + selected.ID.ToString() + "'");

                            if (existedRows.Length > 0)
                            {
                                if (!(existedRows[0]["Value1"] is decimal)) existedRows[0]["Value1"] = 0;
                                existedRows[0]["Value1"] = (decimal)existedRows[0]["Value1"] + 1;
                                if (lblThongTinTonKho.Text.Contains("SL"))
                                    lblThongTinTonKho.Text = lblThongTinTonKho.Text.Replace("SL-", "SL+");
                                else if (!lblThongTinTonKho.Text.Contains("SL+"))
                                    lblThongTinTonKho.Text = string.Format("SL+ | {0}", lblThongTinTonKho.Text);
                                return;
                            }
                            else
                            {
                                KhoanMucChungTu addedNew = _ChungTu.DanhSachChungTuPhuThuoc[0].DanhSachKhoanMuc.CreateNew();
                                addedNew.VatTuHangHoa1ID = selected.ID;
                                addedNew.Value1 = 1;
                                _ChungTu.DanhSachChungTuPhuThuoc[0].DanhSachKhoanMuc.Add(addedNew);
                            }
                        }
                        else if (selected == null)
                        {
                            //throw new CustomException("Hàng hóa chưa có trong danh mục");
                            Store store = DanhMucStore.Instance.GetByStoreID(Config.StoreID);
                            if (!store.Ten.ToUpper().Contains("VIETBOOK"))  // Nếu không là cty sách HN VietBook thì chỉ hiển thị thông báo
                            {
                                FrmWarning.Show("Cảnh báo", "Hàng hóa chưa có trong danh mục.");
                                cmbMaHang.Focus();
                                cmbMaHang.Select();
                                if (txtMaHang.Visible)
                                {
                                    txtMaHang.Focus();
                                    txtMaHang.SelectAll();
                                }
                            }
                            else //Nếu là cty sách HN VietBook thì cho nhập hàng hóa từ bán lẻ luôn
                            {
                                if (Config.DuocPhepTaoHangMoiBanLe == DuocPhepTaoMoiHangHoaTrongManHinhBanLeHayKhong.DuocPhep)
                                {
                                    if (MessageBox.Show("Hàng hóa chưa có trong danh mục.\n Bạn có muốn nhập hàng hóa mới", "Thông báo", MessageBoxButtons.YesNo, MessageBoxIcon.Hand) == DialogResult.Yes)
                                    {
                                        ListForms.VatTuHangHoa.FrmEditHangHoa_RutGonChoBanLe frm = new ListForms.VatTuHangHoa.FrmEditHangHoa_RutGonChoBanLe(cmbMaHang.Text, "Nhập tên hàng hóa vào đây");
                                        if (frm.ShowDialog() == DialogResult.OK)
                                        {
                                            VatTuHangHoa vthh = (VatTuHangHoa)frm.DoiTuong;
                                            cmbMaHang.EditValue = vthh.ID;
                                        }
                                        else
                                        {
                                            SendKeys.Send("{TAB}");
                                        }
                                    }
                                }
                                else
                                {
                                    FrmWarning.Show("Cảnh báo", "Hàng hóa chưa có trong danh mục.");
                                    cmbMaHang.Focus();
                                    cmbMaHang.Select();
                                    if (txtMaHang.Visible)
                                    {
                                        txtMaHang.Focus();
                                        txtMaHang.SelectAll();
                                    }
                                }
                            }
                        }

                        cmbMaHang.Select();
                    }
                }
            }
            catch (Exception ex)
            {
                BasicForms.FrmExceptionNotifier.ShowAndLog(ex);
            }
        }
        private void cmbMaHang_EditValueChanged(object sender, EventArgs e)
        {
            try
            {
                if (cmbMaHang.EditValue is Guid)
                {
                    VatTuHangHoa selected = DanhMucVatTuHangHoa.Instance.GetByID((Guid)cmbMaHang.EditValue);
                    if (selected == null)
                    {
                        //throw new CustomException("Hàng hóa chưa có trong danh mục");
                        MessageBox.Show("Hàng hóa chưa có trong danh mục");
                        cmbMaHang.Focus();
                        cmbMaHang.Select();
                        if (txtMaHang.Visible)
                        {
                            txtMaHang.Focus();
                            txtMaHang.SelectAll();
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                BasicForms.FrmExceptionNotifier.ShowAndLog(ex);
            }
        }

        private void ChooseHangHoaByEnterKey(int KeyChar)
        {
            try
            {
                if (_EditState == EditState.CreatingNew || _EditState == EditState.Modifying)
                {
                    if (!(cmbKho.EditValue is Guid) || (Guid)cmbKho.EditValue == Guid.Empty)
                    {
                        FrmWarning.Show("Thông báo", "Chưa chọn kho.");
                        return;
                    }
                    if (cmbThueSuat.EditValue == null || (Guid)cmbThueSuat.EditValue == Guid.Empty)
                    {
                        FrmWarning.Show("Thông báo", "Chưa chọn thuế suất");
                        cmbThueSuat.Focus();
                        return;
                    }
                    if (KeyChar == 13)
                    {
                        VatTuHangHoa selected = DanhMucVatTuHangHoa.GetByMaInHangHoaDangSuDung(txtMaHang.Text);
                        if (selected != null && _ChungTu != null)
                        {
                            DataRow[] existedRows = _ChungTu.DanhSachChungTuPhuThuoc[0].DanhSachKhoanMuc.DataTable.Select("VatTuHangHoa1ID = '" + selected.ID.ToString() + "'");

                            if (existedRows.Length > 0)
                            {
                                if (!(existedRows[0]["Value1"] is decimal)) existedRows[0]["Value1"] = 0;
                                existedRows[0]["Value1"] = (decimal)existedRows[0]["Value1"] + 1;
                                if (lblThongTinTonKho.Text.Contains("SL"))
                                    lblThongTinTonKho.Text = lblThongTinTonKho.Text.Replace("SL-", "SL+");
                                else if (!lblThongTinTonKho.Text.Contains("SL+"))
                                    lblThongTinTonKho.Text = string.Format("SL+ | {0}", lblThongTinTonKho.Text);
                                return;
                            }
                            else
                            {
                                KhoanMucChungTu addedNew = _ChungTu.DanhSachChungTuPhuThuoc[0].DanhSachKhoanMuc.CreateNew();
                                addedNew.VatTuHangHoa1ID = selected.ID;
                                addedNew.Value1 = 1;
                                _ChungTu.DanhSachChungTuPhuThuoc[0].DanhSachKhoanMuc.Add(addedNew);
                            }
                            cmbMaHang.Focus();
                            cmbMaHang.Select();
                            if (txtMaHang.Visible)
                            {
                                txtMaHang.Focus();
                                txtMaHang.SelectAll();
                            }
                        }
                        else if (selected == null)
                        {
                            //throw new CustomException("Hàng hóa chưa có trong danh mục");
                            Store store = DanhMucStore.Instance.GetByStoreID(Config.StoreID);
                            if (!store.Ten.ToUpper().Contains("VIETBOOK"))  // Nếu không là cty sách HN VietBook thì chỉ hiển thị thông báo
                            {
                                FrmWarning.Show("Cảnh báo", "Hàng hóa chưa có trong danh mục.");
                                cmbMaHang.Focus();
                                cmbMaHang.Select();
                                if (txtMaHang.Visible)
                                {
                                    txtMaHang.Focus();
                                    txtMaHang.SelectAll();
                                }
                            }
                            else //Nếu là cty sách HN VietBook thì cho nhập hàng hóa từ bán lẻ luôn
                            {
                                if (Config.DuocPhepTaoHangMoiBanLe == DuocPhepTaoMoiHangHoaTrongManHinhBanLeHayKhong.DuocPhep)
                                {
                                    if (MessageBox.Show("Hàng hóa chưa có trong danh mục.\n Bạn có muốn nhập hàng hóa mới", "Thông báo", MessageBoxButtons.YesNo, MessageBoxIcon.Hand) == DialogResult.Yes)
                                    {
                                        ListForms.VatTuHangHoa.FrmEditHangHoa_RutGonChoBanLe frm = new ListForms.VatTuHangHoa.FrmEditHangHoa_RutGonChoBanLe(txtMaHang.Text, "Nhập tên hàng hóa vào đây");
                                        if (frm.ShowDialog() == DialogResult.OK)
                                        {
                                            VatTuHangHoa vthh = (VatTuHangHoa)frm.DoiTuong;
                                            txtMaHang.EditValue = vthh.ID;
                                        }
                                        else
                                        {
                                            SendKeys.Send("{TAB}");
                                        }
                                    }
                                }
                                else
                                {
                                    FrmWarning.Show("Cảnh báo", "Hàng hóa chưa có trong danh mục.");
                                    cmbMaHang.Focus();
                                    cmbMaHang.Select();
                                    if (txtMaHang.Visible)
                                    {
                                        txtMaHang.Focus();
                                        txtMaHang.SelectAll();
                                    }
                                }
                            }
                        }

                        cmbMaHang.Focus();
                        cmbMaHang.Select();
                        if (txtMaHang.Visible)
                        {
                            txtMaHang.Focus();
                            txtMaHang.SelectAll();
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                BasicForms.FrmExceptionNotifier.ShowAndLog(ex);
            }
        }

        private delegate void dlReloadDanhMuc();
        private void ReloadDanhMuc()
        {
            try
            {
                _TimeReloadLatest = DateTime.Now;

                if (this.InvokeRequired)
                {
                    this.Invoke(new MethodInvoker(delegate
                    {
                        // do something here;
                        DanhMucVatTuHangHoa.Instance.LoadFromDB();
                    }));
                    return;
                }
                else
                {
                    Thread threadReloadDanhMucHangHoa = new Thread(new ThreadStart(DanhMucVatTuHangHoa.Instance.LoadFromDB));
                    threadReloadDanhMucHangHoa.Start();
                }
            }
            catch (Exception ex)
            {
                BasicForms.FrmProgressBar.StartShowProgress();

                DanhMucVatTuHangHoa.Instance.LoadFromDB();
            }
            finally
            {
                BasicForms.FrmProgressBar.FinishShowProgress();
            }
        }

        private void btnReload_Click(object sender, EventArgs e)
        {
            try
            {
                //BasicForms.FrmProgressBar.StartShowProgress();
                //BasicForms.FrmProgressBar.Status = "Đang lấy danh mục hàng hóa mới nhất";

                //Phải sau 3 phút mới cho reload lại để tránh người dùng ấn liên tục, báo lỗi
                TimeSpan span = DateTime.Now - _TimeReloadLatest;
                if (span.Minutes >= 3)
                {
                    ReloadDanhMuc();
                }
            }
            catch (Exception ex)
            {
                BasicForms.FrmExceptionNotifier.ShowAndLog(ex);
            }
        }

        private void timer_Tick(object sender, EventArgs e)
        {
            try
            {
                btnReload_Click(null, null);
            }
            catch (Exception ex)
            {
                BasicForms.FrmExceptionNotifier.ShowAndLog(ex);
            }
        }
        private void timerKhuyenMai_Tick(object sender, EventArgs e)
        {
            try
            {
                //Để 1phut check một lần. 
                timerKhuyenMai.Interval = 60000;
                // Xem có trong chương trình khuyến mại nào đang hoạt động không?
                DateTime curDateTimeFromServer = GeneralLibs.CommonLib.GetSystemDateTime();
                foreach (ChuongTrinhKhuyenMai chuongTrinhKhuyenMai in DanhMucChuongTrinhKhuyenMai.Instance)
                {
                    bool stop = false;
                    //1 chương trình khuyến mại có nhiều đối tượng khuyến mại
                    DanhMucDoiTuongKhuyenMai dmDoiTuongKhuyenMai = DanhMucDoiTuongKhuyenMai.GetByChuongTrinhKhuyenMaiID(chuongTrinhKhuyenMai.ID);

                    foreach (DataRow dtKhuyenMai in dmDoiTuongKhuyenMai.DataTable.Rows)
                    {
                        Guid doiTuongNghiepVuID = (Guid)dtKhuyenMai["DoiTuongNghiepVuID"];
                        if (dtKhuyenMai != null && cmbDoiTuong.EditValue != null && doiTuongNghiepVuID == (Guid)cmbDoiTuong.EditValue &&
                        chuongTrinhKhuyenMai.NgayBatDau <= curDateTimeFromServer && curDateTimeFromServer < chuongTrinhKhuyenMai.NgayKetThuc)
                        {
                            _ActiveChuongTrinhKhuyenMai = chuongTrinhKhuyenMai;
                            stop = true;
                            break;
                        }
                        else
                        {
                            _ActiveChuongTrinhKhuyenMai = null;
                        }
                    }
                    if (stop) break;
                }

                if (_ActiveChuongTrinhKhuyenMai != null && (_EditState == EditState.CreatingNew || _EditState == EditState.Modifying))
                {
                    DoiTuongKhuyenMai dmDoiTuongKhuyenMai = null;
                    if (!(cmbDoiTuong.EditValue is Guid) || (Guid)cmbDoiTuong.EditValue == Guid.Empty)
                    {
                        if (lblKhuyenMai.Visible) lblKhuyenMai.Visible = false;
                    }
                    else
                    {
                        dmDoiTuongKhuyenMai = DanhMucDoiTuongKhuyenMai.Instance.GetByIDs(_ActiveChuongTrinhKhuyenMai.ID, (Guid)cmbDoiTuong.EditValue);
                        if (dmDoiTuongKhuyenMai != null)
                        {
                            lblKhuyenMai.Text = string.Format("{0} đang tham gia chương trình khuyến mại: {1}. Thời gian từ {2} đến {3}", dmDoiTuongKhuyenMai.DoiTuongNghiepVu.Ten, _ActiveChuongTrinhKhuyenMai.Ma, _ActiveChuongTrinhKhuyenMai.NgayBatDau, _ActiveChuongTrinhKhuyenMai.NgayKetThuc);
                        }
                        else
                        {
                            lblKhuyenMai.Text = "";
                        }
                        if (!lblKhuyenMai.Visible) lblKhuyenMai.Visible = true;
                    }
                }
                else if (lblKhuyenMai.Visible) lblKhuyenMai.Visible = false;
            }
            catch (Exception ex)
            {
                BasicForms.FrmExceptionNotifier.ShowAndLog(ex);
            }
        }

        private void cmbDoiTuong_EditValueChanged(object sender, EventArgs e)
        {
            timerKhuyenMai_Tick(null, null);
        }

        private void btnTinhGiaXuatKho_Click(object sender, EventArgs e)
        {
            try
            {
                BasicForms.FrmProgressBar.StartShowProgress();
                BasicForms.FrmProgressBar.Status = "Đang tính giá vốn hàng xuất kho";
                ThoiDiemKhoaSo thoiDiemKhoaSoGanNhat = DanhMucThoiDiemKhoaSo.Instance.GetThoiDiemKhoaSoGanNhat(dateNgay.DateTime);

                try
                {
                    int count = 0;
                    foreach (KhoanMucChungTu khoanMuc in _ChungTu.DanhSachKhoanMuc)
                    {
                        if (khoanMuc.DataRow.RowState != DataRowState.Unchanged)
                        {
                            if (Config.PhuongPhapTinhGiaTonKho == PhuongPhapTinhGiaTonKho.FIFO)
                            {
                                khoanMuc.Value2 = VatTuHangHoa.CalculateGiaXuatKho(khoanMuc.VatTuHangHoa1ID, (Guid)cmbKho.EditValue, dateNgay.DateTime, khoanMuc.Value1);
                            }
                            else
                            {
                                List<decimal> lst = new List<decimal>();
                                if (Config.PhuongPhapTinhGiaTonKho == PhuongPhapTinhGiaTonKho.BinhQuanGiaNhap)
                                {
                                    lst = DanhMucVatTuHangHoa.Instance.GetGiaVonNhapTrungBinhToanBoCacKhoIncludeMaxMin(khoanMuc.VatTuHangHoa1ID,
                                        thoiDiemKhoaSoGanNhat.ID, thoiDiemKhoaSoGanNhat.ThoiDiem, dateNgay.DateTime);
                                }
                                else
                                {
                                    lst = DanhMucVatTuHangHoa.Instance.GetGiaVonMuaTrungBinhToanBoCacKhoIncludeMaxMin(khoanMuc.VatTuHangHoa1ID,
                                        thoiDiemKhoaSoGanNhat.ID, thoiDiemKhoaSoGanNhat.ThoiDiem, dateNgay.DateTime);

                                    if (lst[0] <= 0)
                                        lst = DanhMucVatTuHangHoa.Instance.GetGiaVonNhapTrungBinhToanBoCacKhoIncludeMaxMin(khoanMuc.VatTuHangHoa1ID,
                                        thoiDiemKhoaSoGanNhat.ID, thoiDiemKhoaSoGanNhat.ThoiDiem, dateNgay.DateTime);
                                }

                                khoanMuc.Value2 = lst[0];
                            }
                        }

                        count++;
                        BasicForms.FrmProgressBar.Status = string.Format("Đã tính {0}/{1}", count, _ChungTu.DanhSachKhoanMuc.Count);
                    }
                }
                catch (SqlException sqlEx)
                {
                    throw new CustomException(CustomException.GetSqlExceptionMessage(sqlEx));
                }
                catch (Exception ex)
                {
                    if (ex is CustomException) throw ex;
                    else
                    {
                        throw new Exception(ex.Message);
                    }
                }
                BasicForms.FrmProgressBar.FinishShowProgress();
            }
            catch (Exception ex)
            {
                BasicForms.FrmExceptionNotifier.ShowAndLog(ex);
            }
        }

        public string GenerateSoChungTuFromConfigInCauHinhKhac(Guid loaiChungTuID, bool tangTheoTungSoMay_ChiDungKhiChonFixTrongCode)
        {
            try
            {
                if (Config.CachSinhSoChungTu == CachSinhSoChungTu.FixTrongCode)
                {
                    return GeneralLibs.CommonLib.GetSoChungTuMacDinh(loaiChungTuID, tangTheoTungSoMay_ChiDungKhiChonFixTrongCode, tangTheoTungSoMay_ChiDungKhiChonFixTrongCode);
                }
                else if (Config.CachSinhSoChungTu == CachSinhSoChungTu.TangTheoTungSoMay)
                {
                    return GeneralLibs.CommonLib.GetSoChungTuMacDinh(loaiChungTuID, true, true);
                }
                else if (Config.CachSinhSoChungTu == CachSinhSoChungTu.TangTheoToanBoHeThong_KhongCoSoMay)
                {
                    return GeneralLibs.CommonLib.GetSoChungTuMacDinh(loaiChungTuID, false, false);
                }
                else if (Config.CachSinhSoChungTu == CachSinhSoChungTu.TangTheoToanBoHeThong_CoSoMay)
                {
                    return GeneralLibs.CommonLib.GetSoChungTuMacDinh(loaiChungTuID, true, false);
                }
                else
                {
                    return "";
                }
            }
            catch (SqlException sqlEx)
            {
                throw new CustomException(CustomException.GetSqlExceptionMessage(sqlEx));
            }
            catch (Exception ex)
            {
                return "";
                if (ex is CustomException) throw ex;
                else
                {
                    throw new Exception(ex.Message);
                }
            }
        }
        public string GenerateSoChungTuFromConfigInCauHinhKhac(Guid loaiChungTuID, string prefix, int noDigits, bool tangTheoTungSoMay_ChiDungKhiChonFixTrongCode)
        {
            try
            {
                if (Config.CachSinhSoChungTu == CachSinhSoChungTu.FixTrongCode)
                {
                    return GeneralLibs.CommonLib.GetSoChungTuMacDinh(loaiChungTuID, prefix, noDigits, tangTheoTungSoMay_ChiDungKhiChonFixTrongCode, tangTheoTungSoMay_ChiDungKhiChonFixTrongCode);
                }
                else if (Config.CachSinhSoChungTu == CachSinhSoChungTu.TangTheoTungSoMay)
                {
                    return GeneralLibs.CommonLib.GetSoChungTuMacDinh(loaiChungTuID, prefix, noDigits, true, true);
                }
                else if (Config.CachSinhSoChungTu == CachSinhSoChungTu.TangTheoToanBoHeThong_KhongCoSoMay)
                {
                    return GeneralLibs.CommonLib.GetSoChungTuMacDinh(loaiChungTuID, prefix, noDigits, false, false);
                }
                else if (Config.CachSinhSoChungTu == CachSinhSoChungTu.TangTheoToanBoHeThong_CoSoMay)
                {
                    return GeneralLibs.CommonLib.GetSoChungTuMacDinh(loaiChungTuID, prefix, noDigits, true, false);
                }
                else
                {
                    return "";
                }
            }
            catch (SqlException sqlEx)
            {
                throw new CustomException(CustomException.GetSqlExceptionMessage(sqlEx));
            }
            catch (Exception ex)
            {
                return "";
                if (ex is CustomException) throw ex;
                else
                {
                    throw new Exception(ex.Message);
                }
            }
        }
        public bool CheckExistedSoChungTuKhongKemSoMayInDB(string soChungTu, Guid chungTuID)
        {
            SqlConnection con = new SqlConnection(LocalSettings.ConnectString);
            try
            {
                con.Open();
                if (CommonLib.StartWithSoMay(soChungTu)) soChungTu = CommonLib.CutSoMayWithOutSoChungTu(soChungTu);
                SqlCommand cmd = con.CreateCommand();
                cmd.CommandText = string.Format("SELECT * FROM ChungTu WHERE DATEPART(yyyy, Ngay) = {0} AND SoKhongKemSoMay = N'{1}' AND ChungTuID <> '{2}'",
                   GeneralLibs.Config.NamTaiChinh, soChungTu, chungTuID);
                SqlDataReader dr = cmd.ExecuteReader();
                if (dr.Read()) return true;
                else return false;
            }
            finally
            {
                con.Close();
            }
        }
        private void FrmEditRelativeChungTu_ResolveConflictSoChungTu(string soChungTu, bool isChungTuGoc, bool showQuestion)
        {
            try
            {
                if (isChungTuGoc)
                {
                    if (showQuestion)
                    {
                        if (MessageBox.Show(string.Format("Đã có chứng từ số {0} cùng năm tài chính tồn tại trong CSDL.\nBạn có muốn tự động tăng số chứng từ lên không?", soChungTu),
                           "Thông báo", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == DialogResult.Yes)
                        {
                            txtSo.Text = this.GenerateSoChungTuFromConfigInCauHinhKhac(DanhMucLoaiChungTu.Instance.GetByMa("HoaDonBanLe").ID, true);
                        }
                    }
                    else
                    {
                        txtSo.Text = this.GenerateSoChungTuFromConfigInCauHinhKhac(DanhMucLoaiChungTu.Instance.GetByMa("HoaDonBanLe").ID, true);
                    }
                }
            }
            catch (Exception ex)
            {
                BasicForms.FrmExceptionNotifier.ShowAndLog(ex);
            }
        }

        #region Xu ly hien thi thong tin ton kho
        private void cmbMaHang_RequireShowThongTinTonKho(object sender, Guid vatTuHangHoaID)
        {
            if (!(cmbKho.EditValue is Guid) || (Guid)cmbKho.EditValue == Guid.Empty) return;
            try
            {
                TinhToanVaHienThiTon((Guid)cmbKho.EditValue, vatTuHangHoaID, lblThongTinTonKho);
            }
            catch (Exception ex)
            {
                //BasicForms.FrmExceptionNotifier.ShowAndLog(ex);
            }
        }
        private void cmbMaHang_RequireHideThongTinTonKho(object sender)
        {
            lblThongTinTonKho.Visible = false;
        }

        private void customGridKhoanMuc_RequireShowThongTinTonKho(object sender, Guid vatTuHangHoaID)
        {
            if (!(cmbKho.EditValue is Guid) || (Guid)cmbKho.EditValue == Guid.Empty) return;
            try
            {
                TinhToanVaHienThiTon((Guid)cmbKho.EditValue, vatTuHangHoaID, lblThongTinTonKho);
            }
            catch (Exception ex)
            {
                BasicForms.FrmExceptionNotifier.ShowAndLog(ex);
            }
        }
        private void customGridKhoanMuc_RequireHideThongTinTonKho(object sender)
        {
            lblThongTinTonKho.Visible = false;
        }

        private void TinhToanVaHienThiTon(Guid khoID, Guid vatTuHangHoaID, DevExpress.XtraEditors.LabelControl label)
        {
            if (khoID == Guid.Empty || vatTuHangHoaID == Guid.Empty) return;
            if (_EditState == EditState.CreatingNew) dateNgay.EditValue = GeneralLibs.CommonLib.GetSystemDateTime();
            SqlConnection con = new SqlConnection(GeneralLibs.LocalSettings.ConnectString);
            try
            {
                con.Open();
                SqlCommand cmd = con.CreateCommand();
                VatTuHangHoa vthh = DanhMucVatTuHangHoa.Instance.GetByID(vatTuHangHoaID);
                TonKho tonTaiKhoNay = TonKho.CalculateTonTuThoiDiemKhoaSoGanNhatDenThoiDiemNhapVaoTheoKho(cmd, dateNgay.DateTime.AddSeconds(-1), khoID, vatTuHangHoaID);
                TonKho tonToanBo = TonKho.CalculateTongTonTuThoiDiemKhoaSoGanNhatDenThoiDiemNhapVao(cmd, dateNgay.DateTime.AddSeconds(-1), vatTuHangHoaID);
                TonKho tongNhap = TonKho.CalculateTongMuaTheoThoiDiemKhoaSoGanNhat(cmd, dateNgay.DateTime.AddSeconds(-1), vatTuHangHoaID);
                TonKho tongXuat = TonKho.CalculateTongBanTheoThoiDiemKhoaSoGanNhat(cmd, dateNgay.DateTime.AddSeconds(-1), vatTuHangHoaID);

                //lblThongTinTonKho.Text = string.Format("CK: {3}| Tại {0}: {1} | Tồn tổng: {2}",
                //    cmbKho.Text, (int)tonTaiKhoNay.SoLuong, (int)tonToanBo.SoLuong, vthh.ChietKhauBan);

                label.Text = string.Format(" Tổng tồn: {0} |  Tồn tại quầy: {1}",
                    (int)tonToanBo.SoLuong, (int)tonTaiKhoNay.SoLuong);
                label.Visible = true;
            }
            catch (Exception ex)  //Không cần thiết hiện, thi thoảng mới bị mà gây khó chịu
            {
                //throw new Exception(ex.Message);
            }
            finally
            {
                con.Close();
            }
        }

        #endregion

        private void customGridKhoanMuc_XoaKhoanMuc(object sender, DataRow row)
        {
            try
            {
                //Lưu lại ID của hàng hóa
                Guid vthhID = Guid.Empty;
                Guid khoID = Guid.Empty;
                if (row["VatTuHangHoa1ID"] is Guid)
                    vthhID = (Guid)row["VatTuHangHoa1ID"];
                if (cmbKho.EditValue != null && cmbKho.EditValue is Guid && (Guid)cmbKho.EditValue != Guid.Empty)
                    khoID = (Guid)cmbKho.EditValue;
                VatTuHangHoa vthh = DanhMucVatTuHangHoa.Instance.GetByID(vthhID);
                //Xóa khoản mục khỏi CSDL 
                string tanNgu = "";
                try
                {
                    if (vthh != null)
                    {
                        tanNgu = string.Format("Khoản mục HĐBL mà chưa lưu: {0}, Giá bán lẻ: {1} đ,SL: {2}, trong chứng từ {3}",
                            vthh.Ma, vthh.GiaBia, Convert.ToInt32(row["Value1"]), txtSo.Text);
                    }
                    else
                    {
                        tanNgu = string.Format("Khoản mục HĐBL mà chưa lưu: {0}, trong chứng từ {1}", row["KhoanMucChungTuID"], _ChungTu.So);
                    }
                    NhatKySuDung.Insert2DB("Xóa", tanNgu);
                }
                catch (SqlException sqlEx)
                {
                    throw new CustomException(CustomException.GetSqlExceptionMessage(sqlEx));
                }
                catch (Exception ex)
                {
                    if (ex is CustomException) throw ex;
                    else
                    {
                        throw new Exception(ex.Message);
                    }
                }
                _ChungTu.DanhSachKhoanMuc.DeleteSingleKhoanMucFromDB(row);

            }
            catch (Exception ex)
            {
                BasicForms.FrmExceptionNotifier.ShowAndLog(ex);
            }
        }

        private void customGridKhoanMuc_RequireShowToolTipTonKho(object sender, Guid vatTuHangHoaID)
        {
            if (!(cmbKho.EditValue is Guid) || (Guid)cmbKho.EditValue == Guid.Empty) return;
            try
            {
                TinhToanVaHienThiTon((Guid)cmbKho.EditValue, vatTuHangHoaID, lblThongTinTonKho);
            }
            catch (Exception ex)
            {
                BasicForms.FrmExceptionNotifier.ShowAndLog(ex);
            }
        }

        private void cmbMaHang_RequireShowToolTipTonKho(object sender, Guid vatTuHangHoaID)
        {
            if (!(cmbKho.EditValue is Guid) || (Guid)cmbKho.EditValue == Guid.Empty) return;
            try
            {
                TinhToanVaHienThiTon((Guid)cmbKho.EditValue, vatTuHangHoaID, lblThongTinTonKho);
            }
            catch (Exception ex)
            {
                BasicForms.FrmExceptionNotifier.ShowAndLog(ex);
            }
        }

        private void cmbThueSuat_EditValueChanged(object sender, EventArgs e)
        {
            try
            {
                if (_EditState == EditState.SavedButNotInLedger || _EditState == EditState.SavedInLedger
                    || _EditState == EditState.Saved || _EditState == EditState.Undefined) return;  //Khi đã lưu rồi thì chỉ cần load lên thôi. K cần update
                if (!(cmbThueSuat.EditValue is Guid) && (Guid)cmbThueSuat.EditValue == Guid.Empty) return;

                FrmProgressBar.StartShowProgress("Đang tính lại thuế suất cho từng hàng hóa");
                foreach (DataRow row in _GridDataSouce.Rows)
                {
                    decimal chietKhau = Convert.ToDecimal(row["Value8"].ToString());
                    row["Value8"] = chietKhau;
                }
            }
            catch (Exception ex)
            {
                BasicForms.FrmExceptionNotifier.Log(ex);
            }
            finally
            {
                FrmProgressBar.FinishShowProgress();
            }
        }

        private void cmbTimKiemHangHoa_RequireHideThongTinTonKho(object sender)
        {
            Store store = DanhMucStore.Instance.GetByStoreID(Config.StoreID);
            string _TenStoreUpper = store.Ten.ToUpper();
            if (_TenStoreUpper.Contains("HUYHOANG") || _TenStoreUpper.Contains("VINH") ||
                   _TenStoreUpper.Contains("BACHKHOA") || _TenStoreUpper.Contains("CPIN"))
            {
                lblThongTinTonKhoTimKiem.Visible = false;
            }
        }
        private void cmbTimKiemHangHoa_RequireShowThongTinTonKho(object sender, Guid vatTuHangHoaID)
        {
            Store store = DanhMucStore.Instance.GetByStoreID(Config.StoreID);
            string _TenStoreUpper = store.Ten.ToUpper();
            if (_TenStoreUpper.Contains("HUYHOANG") || _TenStoreUpper.Contains("VINH") ||
                   _TenStoreUpper.Contains("BACHKHOA") || _TenStoreUpper.Contains("CPIN"))
            {
                if (!(cmbKho.EditValue is Guid) || (Guid)cmbKho.EditValue == Guid.Empty) return;
                try
                {
                    TinhToanVaHienThiTon((Guid)cmbKho.EditValue, vatTuHangHoaID, lblThongTinTonKhoTimKiem);
                    string ckKhuyenMai = " | CK Khuyến mại: ";

                    //Nếu sửa hoặc thêm mới thì tính toán để nhập CK và Giá bán lẻ lấy từ danh mục
                    DoiTuongKhuyenMai doiTuongKhuyenMai = null;
                    if (_ActiveChuongTrinhKhuyenMai != null && cmbDoiTuong.EditValue is Guid) doiTuongKhuyenMai = DanhMucDoiTuongKhuyenMai.Instance.GetByIDs(_ActiveChuongTrinhKhuyenMai.ID, (Guid)cmbDoiTuong.EditValue);
                    if (doiTuongKhuyenMai != null)
                    {
                        if (_ActiveChuongTrinhKhuyenMai != null && _ActiveChuongTrinhKhuyenMai.KieuKhuyenMai == (int)KieuKhuyenMai.TheoThoiGian)
                        {
                            ChiTietKhuyenMaiTheoThoiGian chiTietKhuyenMaiTheoThoiGian = DanhMucChiTietKhuyenMaiTheoThoiGian.Instance.GetByKey(_ActiveChuongTrinhKhuyenMai.ID, vatTuHangHoaID);
                            if (chiTietKhuyenMaiTheoThoiGian != null)
                                ckKhuyenMai += ((int)chiTietKhuyenMaiTheoThoiGian.ChietKhauKhuyenMai).ToString() + "%";
                        }
                        else if (_ActiveChuongTrinhKhuyenMai != null && _ActiveChuongTrinhKhuyenMai.KieuKhuyenMai == (int)KieuKhuyenMai.TheoTongTienTichLuy)
                        {
                            if (cmbDoiTuong.EditValue is Guid)   //Tính tổng số tiền mua hàng tích lũy
                            {
                                if (doiTuongKhuyenMai != null)
                                {
                                    decimal chietKhauKhuyenMai = 0;
                                    decimal tongSoTien = 0;

                                    tongSoTien = (decimal)DanhMucChiTietKhuyenMaiTheoTongTienTichLuy.Instance.CalculateTongTienTichLuyTheoKhachHang((Guid)cmbDoiTuong.EditValue, _ActiveChuongTrinhKhuyenMai.NgayBatDauTinhTongTien, _ActiveChuongTrinhKhuyenMai.NgayKetThucTinhTongTien);

                                    foreach (ChiTietKhuyenMaiTheoTongTienTichLuy chiTietKhuyenMaiTheoTongTienTichLuy in DanhMucChiTietKhuyenMaiTheoTongTienTichLuy.Filter(string.Format("ChuongTrinhKhuyenMaiID = '{0}'", _ActiveChuongTrinhKhuyenMai.ID)))
                                    {
                                        if (chiTietKhuyenMaiTheoTongTienTichLuy.TongTienTu <= tongSoTien && tongSoTien < chiTietKhuyenMaiTheoTongTienTichLuy.TongTienDen)
                                        {
                                            if (chiTietKhuyenMaiTheoTongTienTichLuy != null) chietKhauKhuyenMai = chiTietKhuyenMaiTheoTongTienTichLuy.ChietKhauKhuyenMai;
                                            break;
                                        }
                                    }
                                    //Nếu k nằm trong khoảng tổng tiền nào thì CK = 0
                                    if (chietKhauKhuyenMai >= 0)
                                        ckKhuyenMai += ((int)chietKhauKhuyenMai).ToString() + "%";
                                }
                            }
                        }
                    }

                    if (ckKhuyenMai != " | CK Khuyến mại: ")
                        lblThongTinTonKhoTimKiem.Text += ckKhuyenMai;
                }
                catch (Exception ex)
                {
                    BasicForms.FrmExceptionNotifier.ShowAndLog(ex);
                }
            }
        }

        DataTable PreparingTable()
        {
            DataTable table = new DataTable();
            try
            {
                table.Columns.Add("Mã", typeof(string));
                table.Columns.Add("Số lượng", typeof(decimal));
                table.Columns.Add("Giá bán", typeof(decimal));
                table.Columns.Add("Chiết khấu", typeof(int));
                if (_Store.Ten.ToUpper().Contains("VIETBOOK")) table.Columns.Add("Ghi chú", typeof(string));
            }
            catch (SqlException sqlEx)
            {
                throw new CustomException(CustomException.GetSqlExceptionMessage(sqlEx));
            }
            catch (Exception ex)
            {
                if (ex is CustomException) throw ex;
                else
                {
                    throw new Exception(ex.Message);
                }
            }
            return table;
        }
        private void btnCreateHangHoaAndReadFromExcelFile_Click(object sender, EventArgs e)
        {
            //yêu cầu nhập đối tượng nghiệp vụ vào trước
            object doiTuongNghiepVuID = cmbDoiTuong.EditValue;
            if (!(doiTuongNghiepVuID is Guid) || (Guid)doiTuongNghiepVuID == Guid.Empty)
            {
                FrmWarning.Show("Thông báo", "Cần nhập thông tin khách hàng trước khi nhập hàng để có thể lưu được nhớ giá");
                return;
            }

            //Nếu điều kiện trên ok thì tiếp tục đọc từ excel
            bool chkNeedExportExcel = false;
            DataTable dtInportExcelError = PreparingTable();
            try
            {
                //if (NeedCheckFullInfo != null) NeedCheckFullInfo(this);
                OpenFileDialog openFileDialog = new OpenFileDialog();
                openFileDialog.Filter = "Excel file|*.xlsx;*.xls";
                if (openFileDialog.ShowDialog() == DialogResult.OK)
                {
                    BasicForms.FrmProgressBar.StartShowProgress();

                    string path = openFileDialog.FileName;
                    Excel.ApplicationClass app = new Microsoft.Office.Interop.Excel.ApplicationClass();
                    Excel.Workbook workBook = app.Workbooks.Open(path, 0, true, 5, "", "", true, Excel.XlPlatform.xlWindows, "\t",
                                    false, false, 0, true, 1, 0);
                    Excel.Worksheet workSheet = (Excel.Worksheet)workBook.ActiveSheet;
                    Excel.Range range = workSheet.UsedRange;

                    if (range.Columns.Count >= 4)
                    {
                        Hashtable htHangKhongHople = new Hashtable();
                        bool? readOveride = null, readPlus = null, readIgnore = null;
                        for (int rowIndex = 2; rowIndex <= range.Rows.Count; rowIndex++)
                        {
                            try
                            {
                                string maHang = "";
                                decimal soLuong = 0;
                                decimal donGiaBia = 0;
                                string ghiChu = "";
                                /*Trước đây Huy Hoàng sửa được Giá bán lẻ, trong chi tiết hóa đơn.
                                 Nhưng giờ không cho sửa, mà luôn lấy GiaBia từ danh mục nên cột này bị thừa
                                 Tuy nhiên, vẫn để cột này để mẫu excel dễ đối chiếu.
                                 Phương 10:40 2011-08-30*/
                                decimal chietKhauBan = 0;
                                VatTuHangHoa hanghoa = null;

                                #region Doc cac o du lieu tu Excel va Check hop le
                                try
                                {
                                    maHang = (range.Cells[rowIndex, 2] as Excel.Range).Text.ToString().Trim();
                                }
                                catch (Exception ex)
                                { }
                                try
                                {
                                    soLuong = Convert.ToDecimal((range.Cells[rowIndex, 3] as Excel.Range).Value2.ToString().Trim());
                                }
                                catch (Exception ex)
                                { }
                                try
                                {
                                    donGiaBia = decimal.Parse((range.Cells[rowIndex, 4] as Excel.Range).Value2.ToString().Trim());
                                }
                                catch (Exception ex)
                                { }
                                try
                                {
                                    chietKhauBan = decimal.Parse((range.Cells[rowIndex, 5] as Excel.Range).Value2.ToString().Trim());
                                }
                                catch (Exception ex)
                                { }
                                try
                                {
                                    ghiChu = (range.Cells[rowIndex, 6] as Excel.Range).Value2.ToString();
                                }
                                catch (Exception ex)
                                { }

                                if (maHang == "" && soLuong != 0 && donGiaBia != 0)
                                {
                                    MessageBox.Show(string.Format("Mã hàng ở dòng số {0} không hợp lệ", rowIndex - 2));
                                    continue;
                                }
                                #endregion

                                hanghoa = Lists.DanhMucVatTuHangHoa.Instance.GetByProperty("Ma", maHang);
                                ChungTu phieuXuatKho = _ChungTu.DanhSachChungTuPhuThuoc.GetFirstRow();

                                if (maHang != "" && hanghoa != null)
                                {
                                    DataRow[] rows = phieuXuatKho.DanhSachKhoanMuc.DataTable.Select(string.Format("VatTuHangHoa1ID = '{0}'", hanghoa.ID));
                                    if (rows.Length == 0)  //Chưa có hàng này thì add vào
                                    {
                                        DataRow row = phieuXuatKho.DanhSachKhoanMuc.DataTable.NewRow();
                                        row["VatTuHangHoa1ID"] = hanghoa.ID;
                                        row["Value12"] = hanghoa.GiaBia;
                                        row["Value1"] = soLuong;
                                        row["Value8"] = chietKhauBan;
                                        if (_Store.Ten.ToUpper().Contains("VIETBOOK")) row["Text1"] = ghiChu;
                                        phieuXuatKho.DanhSachKhoanMuc.DataTable.Rows.Add(row);
                                    }
                                    else //Đã có hàng này rồi
                                    {
                                        MessageBoxManager.Abort = "Ghi đè";
                                        MessageBoxManager.Retry = "Cộng dồn";
                                        MessageBoxManager.Ignore = "Bỏ qua";
                                        MessageBoxManager.Register();

                                        if (readOveride == null && readPlus == null && readIgnore == null)  //Nếu cả 3 đều chưa set giá trị thì mới set 1 lần, lần sau nhớ optrion
                                        {
                                            DialogResult result = MessageBox.Show(string.Format("File chứa hàng '{0}' đã có trong hóa đơn.\nBạn có muốn ghi đè dữ liệu từ excel vào không?",
                                                    hanghoa.Ma), "Tùy chọn", MessageBoxButtons.AbortRetryIgnore);
                                            switch (result)
                                            {
                                                case DialogResult.Abort:
                                                    readOveride = true;
                                                    readPlus = false;
                                                    readIgnore = false;
                                                    break;
                                                case DialogResult.Retry:
                                                    readOveride = false;
                                                    readPlus = true;
                                                    readIgnore = false;
                                                    break;
                                                default:
                                                    readOveride = false;
                                                    readPlus = false;
                                                    readIgnore = true;
                                                    break;
                                            }
                                        }

                                        if (readOveride is bool && readOveride == true)
                                        {
                                            rows[0]["VatTuHangHoa1ID"] = hanghoa.ID;
                                            rows[0]["Value12"] = hanghoa.GiaBia;
                                            rows[0]["Value1"] = soLuong;
                                            rows[0]["Value8"] = chietKhauBan;
                                            if (_Store.Ten.ToUpper().Contains("VIETBOOK")) rows[0]["Text1"] = ghiChu;

                                        }
                                        else if (readPlus is bool && readPlus == true)
                                        {
                                            rows[0]["VatTuHangHoa1ID"] = hanghoa.ID;
                                            rows[0]["Value12"] = hanghoa.GiaBia;
                                            if (rows[0]["Value1"] is decimal)
                                                rows[0]["Value1"] = (decimal)rows[0]["Value1"] + soLuong;
                                            else
                                                rows[0]["Value1"] = soLuong;
                                            rows[0]["Value8"] = chietKhauBan;
                                            if (_Store.Ten.ToUpper().Contains("VIETBOOK")) rows[0]["Text1"] = ghiChu;
                                        }
                                        else
                                        {
                                            chkNeedExportExcel = true;
                                            DataRow rowError = dtInportExcelError.NewRow();

                                            if (maHang != "")
                                            {
                                                rowError["Mã"] = maHang;
                                                rowError["Số lượng"] = soLuong;
                                                rowError["Giá bán"] = donGiaBia;
                                                rowError["Chiết khấu"] = chietKhauBan;
                                                if (_Store.Ten.ToUpper().Contains("VIETBOOK")) rowError["Text1"] = ghiChu;
                                                dtInportExcelError.Rows.Add(rowError);
                                            }

                                        }
                                    }
                                }
                                else
                                {
                                    if (maHang != "")
                                    {
                                        chkNeedExportExcel = true;
                                        DataRow rowError = dtInportExcelError.NewRow();
                                        rowError["Mã"] = maHang;
                                        rowError["Số lượng"] = soLuong;
                                        rowError["Giá bán"] = donGiaBia;
                                        rowError["Chiết khấu"] = chietKhauBan;
                                        if (_Store.Ten.ToUpper().Contains("VIETBOOK")) rowError["Text1"] = ghiChu;
                                        dtInportExcelError.Rows.Add(rowError);
                                    }

                                    if (maHang != "") htHangKhongHople.Add(maHang, null);
                                }
                            }
                            catch (SqlException sqlEx)
                            {
                                throw new CustomException(CustomException.GetSqlExceptionMessage(sqlEx));
                            }
                            catch (Exception ex)
                            {
                                if (ex is CustomException) throw ex;
                                else
                                {
                                    throw new Exception(ex.Message);
                                }
                            }
                        }
                    }
                    workBook.Close(false, path, true);

                    FillTongCong();

                    BasicForms.FrmProgressBar.FinishShowProgress();

                    if (chkNeedExportExcel && MessageBox.Show("Bạn có muốn đưa ra excel những hàng không nhập thành công?", "Thống báo", MessageBoxButtons.YesNo) == DialogResult.Yes)
                    {
                        GeneralLibs.ExportToExcel.ExportDataToExcel("Danh sách hàng không nhập thành công", dtInportExcelError);
                    }
                }
            }
            catch (Exception ex)
            {
                BasicForms.FrmExceptionNotifier.ShowAndLog(ex);
            }
            finally
            {
                BasicForms.FrmProgressBar.FinishShowProgress();
            }
        }

        private void chkThanhToanQuaThe_CheckedChanged(object sender, EventArgs e)
        {
            if (_EditState == EditState.CreatingNew || _EditState == EditState.Modifying)
            {
                if (chkThanhToanQuaThe.Checked)
                    txtSoTienKhachDua.EditValue = txtTongSoTien.EditValue;
                else
                {
                    txtSoTienKhachDua.EditValue = 0;
                }
            }

            //Lưu luôn chứng từ đã lưu
            if (_EditState == EditState.Saved || _EditState == EditState.SavedInLedger || _EditState == EditState.SavedButNotInLedger)
            {
                _ChungTu.TrueFalse1 = chkThanhToanQuaThe.Checked;
                _ChungTu.Update2DB();
            }
        }

        private void btnThemKhachHang_Click(object sender, EventArgs e)
        {
            try
            {
                //nếu giữ control thì ra danh sách, không thì ra Form thêm mới
                if (ModifierKeys == Keys.Control)
                {
                    FrmDanhMucKhachHangThanThiet frm = new FrmDanhMucKhachHangThanThiet();
                    frm.ShowDialog();
                }
                else
                {
                    FrmEditKhachHangThanThiet frm = new FrmEditKhachHangThanThiet(null);
                    if (frm.ShowDialog() == DialogResult.OK)
                    {
                        DoiTuongNghiepVu khachHang = (DoiTuongNghiepVu)frm.DoiTuong;
                        cmbDoiTuong.EditValue = khachHang.ID;
                    }
                }
            }
            catch (Exception ex)
            {
                BasicForms.FrmExceptionNotifier.Log(ex);
            }
        }
        private void btnNhanTraLai_Click(object sender, EventArgs e)
        {
            try
            {
                Form showedForm = null;
                showedForm = new FrmEditHangBanTraLaiBanLe(Vouchers.ChungTu.CreateNew(Lists.DanhMucLoaiChungTu.Instance.GetByMa("HangBanTraLai").ID));
                if (showedForm != null)
                {
                    showedForm.Show();
                    //this.SendToBack();
                    showedForm.BringToFront();
                    Application.OpenForms[showedForm.Name].Focus();
                    if (!showedForm.Focused)
                    {
                        this.SendToBack();
                        showedForm.BringToFront();
                        //showedForm.TopMost = true;
                        showedForm.Focus();
                    }
                }
            }
            catch (Exception ex)
            {
                BasicForms.FrmExceptionNotifier.Log(ex);
            }
        }

        private void cmbDoiTuong_EditValueChanged_1(object sender, EventArgs e)
        {
            try
            {
                if (!(cmbDoiTuong.EditValue is Guid) || (Guid)cmbDoiTuong.EditValue == Guid.Empty)
                    return;

                DoiTuongNghiepVu dtNV = DanhMucDoiTuongNghiepVu.GetDanhMucKhachHang().GetByID((Guid)cmbDoiTuong.EditValue);
                if (dtNV != null)
                {
                    if (dtNV.Ten.Trim() != "Khách lẻ")
                    {
                        decimal doanhSo = DanhMucDoiTuongNghiepVu.GetDoanhSoByID(dtNV.ID);
                        string doanhSoText = String.Format("{0:### ### ### ### ###}", doanhSo);
                        //lblDoanhSo.Text = string.Format("Doanh số tích lũy : {0}", doanhSoText);
                    }
                    else
                    {
                        //lblDoanhSo.Text = "";
                    }
                }
            }
            catch (Exception ex)
            {
                BasicForms.FrmExceptionNotifier.Log(ex);
            }
        }

        private void txtTongChietKhau_KeyUp(object sender, KeyEventArgs e)
        {
            try
            {
                //Khi for thì k được FillTongCong, k sẽ bị đệ quy
                _PreventFillTongCong = true;

                decimal phantramCK = 0;
                decimal tienCK = 0;
                decimal tienGiaLe = 0;
                decimal tienThanhToan = 0;

                if (txtTongChietKhau.EditValue != null && txtTongChietKhau.EditValue.ToString().Trim() != "")
                    tienCK = Convert.ToDecimal(txtTongChietKhau.EditValue.ToString().Trim());
                if (txtTongGiaBia.EditValue != null && txtTongGiaBia.EditValue.ToString().Trim() != "")
                    tienGiaLe = Convert.ToDecimal(txtTongGiaBia.EditValue.ToString().Trim());
                if (txtTongSoTien.EditValue != null && txtTongSoTien.EditValue.ToString().Trim() != "")
                    tienThanhToan = Convert.ToDecimal(txtTongSoTien.EditValue.ToString().Trim());

                if (tienGiaLe != 0)
                {
                    phantramCK = (tienCK * 100) / tienGiaLe;

                    foreach (DataRow rowKhoanMuc in _GridDataSouce.Rows)
                    {
                        rowKhoanMuc["Value8"] = phantramCK;
                    }
                }
            }
            catch (Exception ex)
            {
                BasicForms.FrmExceptionNotifier.ShowAndLog(ex);
            }
            finally
            {
                //For xong thì FillTongCong
                _PreventFillTongCong = false;
                FillTongCong();
            }
        }

        //ConnectionString kết nối đến server để xử lý khách hàng thân thiết
        //Mỗi chi nhánh có thể có 1 server khác nhau ==> check qua Tên chi nhánh
        private void TimThongTinTheThanhVien()
        {
            //Reset lại thông tin hiển thị thẻ thành viên, để phía duwois k có dữ liệu thì k hiện lung tung
            lblMaThe.Text = "";
            lblHoTen.Text = "";
            lblDienThoai.Text = "";
            lblCMND.Text = "";

            if (cmbTheThanhVien == null || !(cmbTheThanhVien.EditValue is int) || cmbTheThanhVien.Text.Trim() == "") return;

            //Tạo kết nối đến CSDL máy chủ
            SqlConnection con = new SqlConnection(LocalSettings.ConnectStringForTheThanhVien(_TenStoreUpper));
            try
            {
                con.Open();
                SqlDataAdapter da = new SqlDataAdapter();
                DataTable dt = new DataTable();

                cmd = con.CreateCommand();
                cmd.Parameters.Clear();
                cmd.CommandText = string.Format("SELECT * FROM A0_DMThanhVien WHERE ID = {0}", cmbTheThanhVien.EditValue);
                cmd.CommandType = CommandType.Text;
                da.SelectCommand = cmd;
                da.Fill(dt);

                if (dt != null && dt.Rows.Count > 0)
                {
                    DataRow row = dt.Rows[0];
                    if (row["MaThe"] is string)
                        lblMaThe.Text = "Mã thẻ: " + (string)row["MaThe"];
                    if (row["HoTen"] is string)
                        lblHoTen.Text = "Họ tên: " + (string)row["HoTen"];
                    if (row["DienThoai"] is string)
                        lblDienThoai.Text = "SĐT: " + (string)row["DienThoai"];
                    if (row["CMND"] is string)
                        lblCMND.Text = "Số CMND: " + (string)row["CMND"];
                }
                else
                {
                    lblMaThe.Text = "Không tìm thấy thẻ thành viên nào có thông tin như trên";
                }
            }
            catch (Exception ex)
            {
                BasicForms.FrmExceptionNotifier.ShowAndLog(ex);
            }
            finally
            {
                con.Close();
            }
        }

        private void btnNewTheThanhVien_Click(object sender, EventArgs e)
        {
            FrmEditTheThanhVien frm = new FrmEditTheThanhVien();
            if (frm.ShowDialog() == DialogResult.OK)
            {
                cmbTheThanhVien.Text = (string)frm.MaThe;
                btnTimTheThanhVien_Click(null, null);
            }
        }
        private void btnTimTheThanhVien_Click(object sender, EventArgs e)
        {
            try
            {
                TimThongTinTheThanhVien();
            }
            catch (Exception ex)
            {
                BasicForms.FrmExceptionNotifier.ShowAndLog(ex);
            }
        }

        private void cmbTheThanhVien_EditValueChanged(object sender, EventArgs e)
        {
            if (cmbTheThanhVien.Text.Trim() == "")
            {
                //Reset lại thông tin hiển thị thẻ thành viên, để phía duwois k có dữ liệu thì k hiện lung tung
                lblMaThe.Text = "";
                lblHoTen.Text = "";
                lblDienThoai.Text = "";
                lblCMND.Text = "";
            }
            else
            {
                btnTimTheThanhVien_Click(null, null);
            }
        }
    }
}
